C# Обновление / список обновлений MongoDB <Object>в коллекцию - PullRequest
1 голос
/ 06 февраля 2020

Я искал способ обновить / вставить в MongoDB список элементов в коллекцию MongoDB.

Есть ли способ сделать это, или мне нужно использовать al oop для обновления элементов один за другим?

PS: Проблема не в том, чтобы создать метод, который бы выполнял задание (один за другим), но я хочу избежать слишком больших итераций с базой данных MongoDB.

Вот метод, который я сейчас использую:

    public static void UpdateAll()
    {
        var client = new MongoClient("mongodb://server_ip:27017");
        var db = client.GetDatabase("M_PROJECT");
        var collection = db.GetCollection<Product>("products");

        //Config.Products is a List<Product> that was previously retrieved from the same collection in MongoDB
        foreach(Product product in Config.Products)
        {
            var filter = Builders<Product>.Filter.Eq(p => p.ID, product.ID);
            var update = Builders<Product>.Update.Set("Name", product.Name).Set("Price", 20);
            collection.UpdateOne(filter, update, new UpdateOptions() { IsUpsert = true });
        }
    }

И, возможно, без указания каждого поля / свойства, которое я хочу обновить, а только с применением экземпляра класса.

Ответы [ 2 ]

1 голос
/ 06 февраля 2020

попробуйте выполнить массовую замену следующим образом:

    var models = new List<WriteModel<Product>>();

    foreach (var product in Config.Products)
    {
        if (product.ID == null) product.ID = ObjectId.GenerateNewId();        

        var upsert = new ReplaceOneModel<Product>(
                        filter: Builders<Product>.Filter.Eq(p => p.ID, product.ID),
                        replacement: product)
        { IsUpsert = true };

        models.Add(upsert);
    }

    collection.BulkWrite(models);

Здесь следует отметить, что она полностью перезапишет данные, хранящиеся в БД, данными из ваших экземпляров класса продукта. но я думаю, что с вами все будет в порядке, потому что вы сказали, что продукты получены из одной коллекции.

это то, что моя библиотека MongoDB.Entities делает внутренне для достижения products.Save()

1 голос
/ 06 февраля 2020
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...