【问题标题】:Update mongoDB document in bulk in C#在 C# 中批量更新 mongoDB 文档
【发布时间】: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);

【问题讨论】:

    标签: c# .net mongodb mongodb-.net-driver


    【解决方案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
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    相关资源
    最近更新 更多