【问题标题】:C# MongoDB Update / Upsert List<Object> to CollectionC# MongoDB 更新/Upsert List<Object> 到集合
【发布时间】:2020-02-06 11:48:04
【问题描述】:

我正在寻找一种方法来在 MongoDB 中将项目列表更新/Upsert 到 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 });
        }
    }

也许没有指定我要更新的每个字段/属性,而只是应用类实例。

【问题讨论】:

    标签: c# mongodb list collections multiple-instances


    【解决方案1】:

    尝试像这样进行批量替换:

        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() 而做的事情

    【讨论】:

    • 这正是我想要的
    【解决方案2】:

    【讨论】:

    • 我的意思是如果我可以在集合中的不同文档中更新列表中的每个项目
    猜你喜欢
    • 1970-01-01
    • 2013-06-05
    • 1970-01-01
    • 1970-01-01
    • 2015-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多