在 C# 中批量更新 mongoDB 文档

Posted

技术标签:

【中文标题】在 C# 中批量更新 mongoDB 文档【英文标题】:Update mongoDB document in bulk in C# 【发布时间】:2021-12-13 08:37:40 【问题描述】:

我在 mongo 集合中有多个如下文档(仅提供一个示例)。


    "_id": "5fdb",
    "createddate": "2020-12-17",
    "orders": [
        
            "_id": "4c65",
            "sourcesystemrecordid": null,
            "accepteddate": "2020-12-19",
            "fulfillment": [
                
                    "_id": "7d3ceb",
                    "createdby": "Azekry",
                    "systemid": "123",
                    "systemrecordname": "source1"
                
            ]
        
    ]

在履行过程中,我想将“systemrecordname”=“source1”的所有文档的“systemid”值从“123”更新为“789”,为此我在下面写了代码,但数据未更新。你能帮我解决这个问题吗?

foreach (var item in resultFromDatabse)
                
                    var ordr = item.orders;
                    foreach (var e in ordr)
                    
                        var actualval = "789";

                        foreach (var ef in e.fulfillment.Where(x => x.systemrecordname == "source1"))
                        
                            filter = builder.Eq("systemrecordname", ef.systemrecordname);
                            var update = Builders<EquipmentDemandPlan>.Update.Set("orders.$[e].fulfillment.$[ef].systemid", actualval);

                            UpdateOneModel<EquipmentDemandPlan> updateOne = new UpdateOneModel<EquipmentDemandPlan>(filter, update)
                            
                                ArrayFilters = new List<ArrayFilterDefinition> 
                                         new BsonDocumentArrayFilterDefinition<BsonDocument>(new BsonDocument("ef.systemrecordname", ef.systemrecordname))
                                    
                            ;
                            bulkupdate.Add(updateOne);

                        
                    
                
                collection.BulkWriteAsync(bulkupdate);

【问题讨论】:

【参考方案1】:

你只需要arrayFilters in $set

db.collection.update(
  "orders.fulfillment.systemrecordname": "source1"
,

  $set: 
    "orders.$[o].fulfillment.$[f].systemid": "789"
  
,

  arrayFilters: [
    
      "o._id": 
        $exists: true
      
    ,
    
      "f.systemrecordname": "source1"
    
  ],
  multi: true
)

mongoplayground

【讨论】:

这不是正确的方法,因为元素是嵌套的,所以“orders.fulfillment.systemrecordname”在 C# 代码中不起作用。 在C#中使用$elemmatch,我只是推荐一种更好的mongo语法方式。 c# 驱动程序支持通过从字符串或 BsonDocument 的隐式转换将原始 MQL 提供到 UpdateDefinition

以上是关于在 C# 中批量更新 mongoDB 文档的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Java 对 MongoDB 中的文档进行批量更新?

如何使用计算值批量更新 MongoDB 中服务器上的文档?

mongodb批量更新操作文档的数组键

MongoDB批量更新不同查询条件的数据

Mongodb批量过滤并添加连接字段

PLSQL中批量更新数据