Как обновить и сохранить несколько документов в MongoDB с помощью драйверов C # - PullRequest
13 голосов
/ 29 октября 2011

Я использую MongoDB 2 и хочу обновить несколько документов и добавить в коллекцию значение, подобное processed:true.Но MongoDB c # api позволяет нам только обновить несколько записей или сохранить одну запись.

Как решить эту проблему, используя C # api?

Ответы [ 5 ]

16 голосов
/ 02 декабря 2014

После Mongo 2.6 вы можете сделать Bulk 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();
14 голосов
/ 29 октября 2011

Вы не можете сделать это в одном утверждении.

У вас есть два варианта

1) перебрать все объекты и выполнить upserts

2) выяснить, какие объекты необходимо обновить, а какие - вставить, затем выполнить пакетную вставку и мульти-обновление

8 голосов
/ 25 августа 2015

Для тех, кто использует версию 2.0 MongoDB.Driver , вы можете использовать метод 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); 
2 голосов
/ 23 марта 2014

Попробуйте сначала удалить все элементы, которые нужно вставить из коллекции, а затем вызвать 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 ");
                }
            });
        })
1 голос
/ 16 января 2013

UpdateFlags - это перечисление в драйвере C #, которое позволит вам указать оба сразу.Как и любые другие перечисления с флагами, вы делаете это по биту "или".

var flags = UpdateFlags.Upsert | UpdateFlags.Multi;

Здесь вы можете прочитать документы по перечислениям (http://msdn.microsoft.com/en-us/library/cc138362.aspx), обратив особое внимание на раздел о типах перечисления как битовые флаги

...