我正在使用MongoDB 2,並且想要更新多個文檔並在集合中插入像processed:true
這樣的值。但是,MongoDB c#api只允許我們更新多個記錄或提起一條記錄。如何使用C#驅動程序更新和插入MongoDB中的多個文檔
如何使用C#API解決這個問題?
我正在使用MongoDB 2,並且想要更新多個文檔並在集合中插入像processed:true
這樣的值。但是,MongoDB c#api只允許我們更新多個記錄或提起一條記錄。如何使用C#驅動程序更新和插入MongoDB中的多個文檔
如何使用C#API解決這個問題?
你不能在一個聲明中做到這一點。
你有兩個選擇
1)遍歷所有的對象,做upserts
2)找出哪些對象已得到更新並具有與被插入,然後做批量插入和多更新
UpdateFlags是C#驅動程序中的枚舉,它可讓您一次指定兩者。就像任何其他標誌枚舉,你做這個「或」。
var flags = UpdateFlags.Upsert | UpdateFlags.Multi;
你可以閱讀這裏枚舉(http://msdn.microsoft.com/en-us/library/cc138362.aspx)特別關注作爲位標誌上枚舉類型的部分文檔
先嚐試刪除所有項目從收集插入,然後調用插入:
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 ");
}
});
})
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();
我們的開發團隊使用-MongoDB 3.0.0和-MongoDB C#驅動程序版本1.7.0.4714。 MongoDB C#驅動程序版本1.7.0.4714抱怨InitializeUnorderedBulkOperation()未定義。 –
對於使用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);
這對我有幫助。非常感謝。在我的情況下,我得到一個IEnumerable作爲項目被插入。 'BulkWriteAsync'需要一個IEnumerable,所以我把它修改成這樣的:'VAR模型= items.Select(項目=>新ReplaceOneModel
這樣做的一個問題是讀取集合的客戶端在操作過程中可能會看到丟失的對象。如果你的客戶可以容忍這一點,那麼這似乎是一個合理的方法。 –