MongoDB(C#)系列四 原子批量插入_.NET_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > .NET > MongoDB(C#)系列四 原子批量插入

MongoDB(C#)系列四 原子批量插入

 2013/10/21 23:19:56  Francis Wang  博客园  我要评论(0)
  • 摘要:插入一个document和插入多个document的用法差不多,下面重点演示插入多个document的用法,并演示一个原子的批量插入。1.插入一个document可以调用MongoCollection的Insert方法插入一个document。Insert方法有如下几个版本:publicvirtualWriteConcernResultInsert<TNominalType>(TNominalTypedocument)
  • 标签:C# MongoDB

插入一个document和插入多个document的用法差不多,下面重点演示插入多个document的用法,并演示一个原子的批量插入。
1.插入一个document
可以调用MongoCollection的Insert方法插入一个document。Insert方法有如下几个版本:

public virtual WriteConcernResult Insert<TNominalType>(TNominalType document);
public virtual WriteConcernResult Insert<TNominalType>(TNominalType document, MongoInsertOptions options);
public virtual WriteConcernResult Insert<TNominalType>(TNominalType document, WriteConcern writeConcern);


第一个方法比较简单,第二个方法和第三个方法的使用和批量插入原理一样。
2.批量插入

public virtual IEnumerable<WriteConcernResult> InsertBatch(IEnumerable<TDefaultDocument> documents);

public virtual IEnumerable<WriteConcernResult> InsertBatch(IEnumerable<TDefaultDocument> documents, MongoInsertOptions options);

public virtual IEnumerable<WriteConcernResult> InsertBatch(IEnumerable<TDefaultDocument> documents, WriteConcern writeConcern);

可以调用InsertBatch方法向集合中插入一个数组,集合。下面演示如何插入一个数组。
为了插入一个数组,首先定义他,如下:

var batch = new BsonDocument[] { 
new BsonDocument("x",1),
new BsonDocument("x",2),
new BsonDocument("x",3)
};

然后调用InsertBatch方法插入这个数组:

collection.InsertBatch(batch);


下面验证是否插入成功:

Console.WriteLine("count:{0}",collection.Count());//这里输出3

var result=collection.FindOne(Query.EQ("x",2));
Console.WriteLine("the value of x field in result:{0}",result["x"].AsInt32);//这里输出2

OK,插入成功。
完整代码:

  private static void InsertBatchDemo() {
            var connetionString = "mongodb://localhost/";
            var mongoUrl = new MongoUrl(connetionString);
            var clientSettings = MongoClientSettings.FromUrl(mongoUrl);
            var client = new MongoClient(clientSettings);

            var mongoServer = client.GetServer();
            var database = mongoServer.GetDatabase("firstDb");
            var collection = database.GetCollection("student");
            //为了便于测试,如果这个集合以及存在,先删除。
            collection.Drop();

            var batch = new BsonDocument[] { 
                new BsonDocument("x",1),
                new BsonDocument("x",2),
                new BsonDocument("x",3)
            };

            collection.InsertBatch(batch);

            Console.WriteLine("count:{0}",collection.Count());

            var result=collection.FindOne(Query.EQ("x",2));
            Console.WriteLine("the value of x field in result:{0}",result["x"].AsInt32);
           
        }

3.如何处理插入过程中出现的错误
为了便于演示,首先定义一个包含有重复值的数组:

var batch = new BsonDocument[] { 
new BsonDocument("x",1),
new BsonDocument("x",2),
new BsonDocument("x",2),
new BsonDocument("x",3)
};

如果集合中在x字段上存在一个唯一索引,那么插入batch时,就会在插入第二个 BsonDocument("x",2)处失败,后面的元素就不会再插入。

现在,我想要在插入batch时,即使出现了重复值,我依旧想要插入BsonDocument("x",3)。这时就要用到InsertBatch的第二个重载方法了,如下:

public virtual IEnumerable<WriteConcernResult> InsertBatch(IEnumerable<TDefaultDocument> documents, MongoInsertOptions options);


InsertBatch方法接受一个MongoInsertOptions参数,现在构造他:

MongoInsertOptions options = new MongoInsertOptions {
  Flags=InsertFlags.ContinueOnError
};


通过为option的Flags属性指定一个InsertFlags.ContinueOnError参数,可以在插入batch时即使出现了错误,也要继续插入后面的元素。
完整代码:

 private static void InsertBatchContinueOnErrorDemo() {
            var connetionString = "mongodb://localhost/";
            var mongoUrl = new MongoUrl(connetionString);
            var clientSettings = MongoClientSettings.FromUrl(mongoUrl);
            var client = new MongoClient(clientSettings);

            var mongoServer = client.GetServer();
            var database = mongoServer.GetDatabase("firstDb");
            var collection = database.GetCollection("student");

            //为了便于测试,如果这个集合以及存在,先删除。
            collection.Drop();

            //在x字段上添加一个唯一索引。
            collection.EnsureIndex(IndexKeys.Ascending("x"),IndexOptions.SetUnique(true));


            var batch = new BsonDocument[] { 
                new BsonDocument("x",1),
                new BsonDocument("x",2),
                new BsonDocument("x",2),
                new BsonDocument("x",3)  
            };

            MongoInsertOptions options = new MongoInsertOptions {
                Flags=InsertFlags.ContinueOnError//插入过程出现错误时,继续插入后面的元素。
            };
            
            //在插入batch时,由于值中重复所以会引发一个WriteConcernException异常//没关系,这个异常仅仅是告诉我们batch中具有重复值而已。
            try {
                collection.InsertBatch(batch,options);
            } catch (WriteConcernException) {
                 Console.WriteLine("count:{0}", collection.Count());//这里将输出三,表明集合中三条记录

                 //这里查看一下BsonDocument("x",3)是否插入成功
                 var result = collection.FindOne(Query.EQ("x",3));
                 //输出3,表明BsonDocument("x",3)已经插入成功
                 Console.WriteLine("the value of x field in result:{0}",result["x"].AsInt32);
            }
           
        }


总结:可以使用Insert插入单个文档,使用InsertBatch插入批量文档。默认情况下,使用InsertBatch批量插入时,如果中间出现了错误,后面的元素将不会在插入,但是前面的元素是成功插入到数据库集合中的。
如果想要在插入过程中出现了错误的话,以后的元素也要插入进去,此时要使用MongoInsertOptions来进行一下配置。

发表评论
用户名: 匿名