如何使用C#驱动程序在MongoDB中更新和升级多个文档

Nit*_*wal 13 upsert mongodb

我正在使用MongoDB 2,我想更新多个文档并将一个值processed:true 插入到集合中.但MongoDB c#api只允许我们更新多个记录或Upsert一条记录.

如何使用C#api解决这个问题?

PUG*_*PUG 16

之后Mongo 2.6,你可以做批量更新/ Upserts.以下示例使用c#驱动程序进行批量更新

MongoCollection<foo> collection = database.GetCollection<foo>(collectionName);
      var bulk = collection.InitializeUnorderedBulkOperation();
      foreach (FooDoc fooDoc in fooDocsList)
      {
        var update = new UpdateDocument { {fooDoc.ToBsonDocument() } };
        bulk.Find(Query.EQ("_id", fooDoc.Id)).Upsert().UpdateOne(update);
      }
      BulkWriteResult bwr =  bulk.Execute();
Run Code Online (Sandbox Code Playgroud)

  • 我们的开发团队使用-MongoDB 3.0.0和-MongoDB C#驱动程序版本1.7.0.4714。MongoDB C#驱动程序版本1.7.0.4714抱怨未定义InitializeUnorderedBulkOperation()。 (3认同)

jef*_*cco 14

你不能在一个声明中做到这一点.

你有两个选择

1)遍历所有对象并进行upsert

2)确定哪些对象必须更新以及哪些对象必须插入然后执行批量插入和多次更新


Joe*_*oey 9

对于使用MongoDB.Driver 2.0版的用户,可以使用BulkWriteAsync方法.

<!-- language: c# -->
// our example list
List<Products> products = GetProductsFromSomewhere();  

var collection = YourDatabase.GetCollection<BsonDocument>("products"); 

// initialise write model to hold list of our upsert tasks
var models = new WriteModel<BsonDocument>[products.Count];

// use ReplaceOneModel with property IsUpsert set to true to upsert whole documents
for (var i = 0; i < products.Count; i++){
    var bsonDoc = products[i].ToBsonDocument();
    models[i] = new ReplaceOneModel<BsonDocument>(new BsonDocument("aw_product_id", products[i].aw_product_id), bsonDoc) { IsUpsert = true };
};

await collection.BulkWriteAsync(models); 
Run Code Online (Sandbox Code Playgroud)

  • 这对我有所帮助.非常感谢.在我的情况下,我得到一个IEnumerable作为要插入的项目.`BulkWriteAsync`采用IEnumerable,所以我把它修改为:`var models = items.Select(item => new ReplaceOneModel <T>(new ExpressionFilterDefinition <T>(doc => doc.Id == item.Id ),item){IsUpsert = true});` (8认同)