C# MongoDB 更新/更新列表<Object> 到集合

C# MongoDB Update / Upsert List<Object> to Collection

我正在寻找一种方法来更新/更新 MongoDB 项目列表到 MongoDB 集合。

有什么方法可以做到,或者我必须使用循环来逐个更新项目?

P.S:问题不在于制作一个可以完成工作的方法(一个接一个),但我想避免对 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 });
        }
    }

也许没有指定我要更新的每个 Field/Property,而只是应用 class 实例。

是的,您可以使用 UpdateMany() 而不是 UpdateOne()。有关详细信息,请参阅 https://www.mongodb.com/blog/post/quick-start-csharp-and-mongodb--update-operation and https://mongodb.github.io/mongo-csharp-driver/2.9/apidocs/html/M_MongoDB_Driver_IMongoCollectionExtensions_UpdateMany__1.htm

像这样尝试批量替换:

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

这里要注意的是,它会用您的产品 class 实例中的数据完全覆盖存储在数据库中的数据。但我认为你会没事的,因为你说产品是从同一个系列中检索的。

这就是我的图书馆 MongoDB.Entities 在内部所做的以实现 products.Save()