【问题标题】:MongoDB .NET Driver update Cannot use the part ... to traverse the elementMongoDB .Net 驱动更新不能使用部分...遍历元素
【发布时间】:2022-01-21 11:41:51
【问题描述】:

我正在尝试重命名一个字段,但最终出现错误。我可能会错过什么?

写入操作导致错误。 不能使用部分(Orders of Orders.Number)遍历元素({Orders: [ { CustomFields: { Пара паков: { FieldId: ObjectId('61e670f9c0fe1106a51a2e23'), Type: "Text", ValueBson: "8989" },权重:{ FieldId:ObjectId('6149d5de44175b8324482915'),类型:“数字”,ValueBson:2222 } },_id:ObjectId('61e6751027c21629e070091b'),数字:“21312”}]})

var orderFilter = Builders<VisitTask>.Filter.Empty;
UpdateDefinition<VisitTask> update = Builders<VisitTask>.Update.Rename($"Orders.Number", $"Orders.TestNumber");
Collection.UpdateMany(orderFilter, update, new UpdateOptions { IsUpsert = true });

文档

{
    "_id" : ObjectId("61e674fa27c21629e070091a"),
    "LastUpdateDate" : ISODate("2022-01-18T08:07:52.008Z"),
    "Orders" : [ 
        {
            "CustomFields" : {
                "Пара паков" : {
                    "FieldId" : ObjectId("61e670f9c0fe1106a51a2e23"),
                    "Type" : "Text",
                    "ValueBson" : "8989"
                }
            },
            "_id" : ObjectId("61e6751027c21629e070091b"),
            "Number" : "21312"
        }
    ],
}

【问题讨论】:

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


    【解决方案1】:

    $rename 运算符无法更新嵌套数组中的字段名称。

    相反,您需要 $set 将现有的 Number 值添加到具有 $map 的新字段 TestNumber。然后$unset 删除Orders.TestNumber 字段。

    注意:前面的回答会导致输出不正确。需要使用 $map 来更新数组中的对象。

    db.collection.update({},
    [
      {
        $set: {
          Orders: {
            $map: {
              input: "$Orders",
              in: {
                $mergeObjects: [
                  {
                    "Number-test": "$$this.Number"
                  },
                  "$$this"
                ]
              }
            }
          }
        }
      },
      {
        $unset: "Orders.Number"
      }
    ],
    {
      multi: true
    })
    

    Sample Mongo Playground


    [适用于 MongoDB .Net 驱动程序 2.13 版]

    对于C#,你需要使用UpdateDefinitionBuilder&lt;TDocument&gt;.Pipeline Method,如下:

    解决方案 1

    UpdateDefinition<VisitTask> update = Builders<VisitTask>.Update.Pipeline(
        new PipelineStagePipelineDefinition<VisitTask, VisitTask>(
            new PipelineStageDefinition<VisitTask, VisitTask>[]
            {
                new BsonDocument("$set", 
                    new BsonDocument("Orders", 
                        new BsonDocument("$map", 
                            new BsonDocument
                            {
                                { "input", "$Orders" }, 
                                { "in", 
                                    new BsonDocument("$mergeObjects", 
                                        new BsonArray
                                        {
                                            new BsonDocument("Number-test", "$$this.Number"),
                                            "$$this"
                                        }) 
                                }
                            }))),
                new BsonDocument("$unset", "Orders.Number")
            }));
    

    解决方案 2

    UpdateDefinition<VisitTask> update = Builders<VisitTask>.Update.Pipeline(
        new BsonDocument[]
        {
            new BsonDocument("$set", 
                new BsonDocument("Orders", 
                    new BsonDocument("$map", 
                        new BsonDocument
                        {
                            { "input", "$Orders" }, 
                            { "in", 
                                new BsonDocument("$mergeObjects", 
                                    new BsonArray
                                    {
                                        new BsonDocument("Number-test", "$$this.Number"),
                                        "$$this"
                                    }) 
                            }
                        }))),
            new BsonDocument("$unset", "Orders.Number")
        }
    );
    

    【讨论】:

    • 在 2.8.0 版本中会是什么样子?
    • 在 2.8 版本中进行了一些尝试后,我怀疑这个 set & unset (rename) 数组中的嵌套字段是行不通的。也许您应该寻找最新版本的 MongoDB .Net 驱动程序。
    • 好的,我尝试将您的方法也用于“Пара паков”字段,
    • “订单”:[{“CustomFields”:{“Пара паков-test”:[[]]},“_id”:ObjectId(“61e6751027c21629e070091b”),“TestNumber”:[“21312 " ] } ],
    • 结果数组坏了
    猜你喜欢
    • 2023-03-26
    • 2019-01-17
    • 2015-09-06
    • 2018-04-28
    • 1970-01-01
    • 2018-07-01
    • 2012-05-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多