插入一个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来进行一下配置。