14

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

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

4

6 回答 6

19

Mongo 2.6您可以进行批量更新/更新插入之后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();
于 2014-12-02T20:34:20.263 回答
16

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

你有两个选择

1) 遍历所有对象并做 upserts

2)找出哪些对象必须更新,哪些必须插入,然后进行批量插入和多次更新

于 2011-10-28T22:48:28.187 回答
10

对于使用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); 
于 2015-08-24T21:10:12.350 回答
2

尝试首先从集合中删除所有要插入的项目,然后调用 insert:

        var search = [];
        arrayToInsert.forEach(function(v, k) {
            search.push(v.hash); // my unique key is hash. you could use _id or whatever
        })
        collection.remove({
            'hash' : {
                $in : search
            }
        }, function(e, docs) {

            collection.insert(arrayToInsert, function(e, docs) {
                if (e) {
                    console.log("data failed to update ", e);
                }
                else {
                    console.log("data updated ");
                }
            });
        })
于 2014-03-22T23:49:57.597 回答
1

UpdateFlags 是 C# 驱动程序中的一个枚举,可让您同时指定两者。就像任何其他标志枚举一样,您可以通过位“或”来执行此操作。

var flags = UpdateFlags.Upsert | UpdateFlags.Multi;

您可以在此处阅读有关枚举的文档 (http://msdn.microsoft.com/en-us/library/cc138362.aspx),特别注意枚举类型作为位标志的部分

于 2013-01-16T14:29:26.570 回答
1

使用 mongoose@5.9.9 - 尝试 initializeUnorderedBulkOp():

export const InfoFunc = (Infos: Infos[]) => {

  const bulk = InfoResult.collection.initializeUnorderedBulkOp();
  Infos.forEach((info: Infos) => bulk.find({ "Id": info.Id}).upsert().updateOne(info));
  bulk.execute();
}
于 2020-04-16T14:44:09.487 回答