2011-10-28 65 views

回答

12

你不能在一個聲明中做到這一點。

你有兩個選擇

1)遍歷所有的對象,做upserts

2)找出哪些對象已得到更新並具有與被插入,然後做批量插入和多更新

1

UpdateFlags是C#驅動程序中的枚舉,它可讓您一次指定兩者。就像任何其他標誌枚舉,你做這個「或」。

var flags = UpdateFlags.Upsert | UpdateFlags.Multi; 

你可以閱讀這裏枚舉(http://msdn.microsoft.com/en-us/library/cc138362.aspx)特別關注作爲位標誌上枚舉類型的部分文檔

1

先嚐試刪除所有項目從收集插入,然後調用插入:

 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 "); 
       } 
      }); 
     }) 
+2

這樣做的一個問題是讀取集合的客戶端在操作過程中可能會看到丟失的對象。如果你的客戶可以容忍這一點,那麼這似乎是一個合理的方法。 –

14

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(); 
+0

我們的開發團隊使用-MongoDB 3.0.0和-MongoDB C#驅動程序版本1.7.0.4714。 MongoDB C#驅動程序版本1.7.0.4714抱怨InitializeUnorderedBulkOperation()未定義。 –

4

對於使用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); 
+3

這對我有幫助。非常感謝。在我的情況下,我得到一個IEnumerable作爲項目被插入。 'BulkWriteAsync'需要一個IEnumerable,所以我把它修改成這樣的:'VAR模型= items.Select(項目=>新ReplaceOneModel (新ExpressionFilterDefinition (DOC => doc.Id == item.Id)項) {IsUpsert = true});' –

相關問題