2011-10-28 12 views
9

MongoDB 2を使用しています。複数のドキュメントを更新し、processed:true のような値をコレクションに追加したいとします。しかし、MongoDB c#apiでは、複数のレコードを更新するか、単一のレコードを更新することしかできません。C#ドライバを使用してMongoDBで複数のドキュメントを更新およびアップする方法

どのようにC#APIを使用してこの問題を解決するには?

答えて

12

1つのステートメントでは実行できません。

次の2つのオプション

1)すべてのオブジェクトをループを持っており、アップサート

2を行う)を更新し、バッチ挿入およびマルチを行い、その後に挿入されなければならない取得する必要がどのオブジェクトを見つけ出しますupdate

1

UpdateFlagsは、両方を同時に指定できるようにするC#ドライバの列挙型です。他のフラグenumと同様に、あなたはビット "または"でこれを行います。

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

これの1つの問題は、コレクションを読み取っているクライアントが操作中にオブジェクトが見つからないことがあることです。あなたのクライアントがそれを容認できるなら、これは合理的なアプローチのようです。 –

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#Driver Version 1.7.0.4714を使用しています。 MongoDB C#ドライバのバージョン1.7.0.4714では、InitializeUnorderedBulkOperation()が未定義であると不平を言っています。 –

4

MongoDB.Driverのバージョン2.0を使用している場合は、BulkWriteAsyncメソッドを使用できます。

+3

それは私を助けました。どうもありがとう。私の場合、私はIEnumerableをupsertedする項目として取得します。 'BulkWriteAsync'はIEnumerableをとるので、これを次のように変更しました:' var models = items.Select(item => new ReplaceOneModel (new ExpressionFilterDefinition (doc => doc.Id == item.Id)item) {IsUpsert = true}); ' –

関連する問題