我正在使用MongoDB 2,我想更新多个文档并插入像processed:true
这样的值
进入收藏。但MongoDB c#api只允许我们更新多个记录或Upsert一条记录。
如何使用C#api解决此问题?
答案 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();
}