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

时间:2011-10-28 20:49:02

标签: mongodb upsert

我正在使用MongoDB 2,我想更新多个文档并插入像processed:true这样的值 进入收藏。但MongoDB c#api只允许我们更新多个记录或Upsert一条记录。

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

5 个答案:

答案 0 :(得分:16)

Mongo 2.6之后,您可以批量Updates/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();

答案 1 :(得分:14)

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

您有两个选择

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

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

答案 2 :(得分: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 ");
                }
            });
        })

答案 3 :(得分:1)

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

var flags = UpdateFlags.Upsert | UpdateFlags.Multi;

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

答案 4 :(得分: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();
}