web-dev-qa-db-ja.com

C#ドライバーを使用してMongoDBで複数のドキュメントを更新およびアップサートする方法

MongoDB 2を使用していますが、複数のドキュメントを更新し、processed:trueのような値をコレクションにアップサートしたいと思います。ただし、MongoDB c#apiでは、複数のレコードを更新するか、単一のレコードをアップサートすることしかできません。

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

13
Nitin Agarwal

Mongo 2.6の後で、一括処理を実行できます 更新/更新 。以下の例では、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();
16
PUG

1つのステートメントでそれを行うことはできません。

2つのオプションがあります

1)すべてのオブジェクトをループし、アップサートを実行します

2)どのオブジェクトを更新する必要があり、どのオブジェクトを挿入する必要があるかを把握してから、バッチ挿入とマルチ更新を実行します

14
jeffsaracco

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); 
9
Joey

最初にコレクションから挿入するすべてのアイテムを削除してから、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 ");
                }
            });
        })
2
Henry

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

var flags = UpdateFlags.Upsert | UpdateFlags.Multi;

ビットフラグとしての列挙型のセクションに特に注意を払いながら、ここ(http://msdn.Microsoft.com/en-us/library/cc138362.aspx)で列挙型に関するドキュメントを読むことができます。

1
Craig Wilson