Mongo Db:将字段重命名为数组的数组

问题描述 投票:0回答:1

我有一个 MongoDb 集合,其中包含以下文档。我需要更新重命名两个字段的所有文档。两个字段都放入一个数组或数组的数组中。

{
    "_id" : NumberLong(7499),
    "CommitId" : LUUID("dee196c8-8a7b-d146-b1e8-f5c7279f056e"),
    "CommitStamp" : ISODate("2017-11-01T05:58:40.331Z"),
    "Headers" : [ 
        [ 
            "AggregateType", 
            "Kimo.Engine.Model.Documents.Document"
        ], 
        [ 
            "command.timestamp", 
            "2017-11-01T05:58:40.3318022Z"
        ]
    ],
    "Events" : [ 
        {
            "StreamRevision" : 1,
            "Payload" : {
                "Headers" : {},
                "Body" : {
                    "_t" : "DocumentCreatedFromMobile_1",
                    "MessageId" : LUUID("70dbc516-9f0e-8c4d-a502-3876c5f09309"),
                    "AggregateId" : "Document_49",
                    "Code" : "Document_49",
                    "Info" : {
                        "DocumentMarkup" : "0.0",
                        "DocumentMarkupOnNetCost" : "100.0",
                        "Lines" : [ 
                            {
                                "LineMarkup" : "0.0",
                                "LineMarkupOnNetCost" : "100.0"
                            }
                        ]
                    },
                    "UserId" : {
                        "_id" : "User_4"
                    },
                    "CreationDate" : ISODate("2017-10-31T10:00:55.000Z"),
                    "MobileId" : "C896E1DE-7B8A-46D1-B1E8-F5C7279F056E",
                    "UploadToServerTimeStamp" : ISODate("2017-11-01T05:58:40.331Z")
                }
            }
        }, 
        {
            "StreamRevision" : 2,
            "Payload" : {
                "Headers" : {},
                "Body" : {
                    "_t" : "DocumentArchivedFromMobile_1",
                    "MessageId" : LUUID("310473ef-9d23-9242-a483-fa8daed06cbf"),
                    "AggregateId" : "Document_49",
                    "MobileId" : "C896E1DE-7B8A-46D1-B1E8-F5C7279F056E",
                    "SyncReference" : null,
                    "Info" : {
                        "DocumentMarkup" : "0.0",
                        "DocumentMarkupOnNetCost" : "100.0",
                        "Lines" : [ 
                            {
                                "LineMarkup" : "0.0",
                                "LineMarkupOnNetCost" : "100.0"
                            }
                        ]
                    },
                    "UserId" : {
                        "_id" : "User_4"
                    },
                    "LastModifiedTimeStamp" : ISODate("2017-10-31T10:00:55.000Z"),
                    "UploadToServerTimeStamp" : ISODate("2017-11-01T05:58:40.331Z")
                }
            }
        }
    ],
    "Dispatched" : false,
    "StreamRevisionFrom" : 1,
    "StreamRevisionTo" : 2,
    "BucketId" : "Kimo",
    "StreamId" : "Document_49",
    "CommitSequence" : 1
}

在本文档中,我需要重命名字段 Events.Payload.Body.Info.DocumentMarkupOnNetCost 和 Events.Payload.Body.Info.Lines.LineMarkupOnNetCost。 事件和线路是数组。

我会这样做,但保存不再起作用......

var docs = db.getCollection('Commits').find({StreamId: /Document_/, BucketId:'Kimo'});
docs.forEach(function(doc){
    doc.Events.forEach(function(event){
        
        event.Payload.Body.Info.DocumentSaleMargin = event.Payload.Body.Info.DocumentMarkupOnNetCost;
        delete event.Payload.Body.Info["DocumentMarkupOnNetCost"];
        delete event.Payload.Body.Info["DocumentMarkupAmountOnNetCost"]; 
        
        event.Payload.Body.Info.Lines.forEach(function(line){
            
            line.LineSaleMargin = line.LineMarkupOnNetCost;
            delete line["LineMarkupOnNetCost"];
            delete line["LineMarkupAmountOnNetCost"];
        })
        
    })
    db.getCollection('Commits').save(doc) 
})
mongodb mongodb-query
1个回答
0
投票

我不确定你的代码有什么问题,但你需要通过打印值来调试自己,


知识的另一种选择:

您可以使用带有聚合管道的更新通过查询来完成此操作,但这取决于集合和文档的大小。

第一阶段循环

Events
数组以到达嵌套对象属性并克隆旧属性的值,我们使用
$mergeObjects
来合并对象,并使用
$map
来迭代数组。

第二阶段

$unset
将永久删除指定的属性。

db.getCollection('Commits').updateMany(
{ StreamId: /Document_/, BucketId:'Kimo' },
[
  {
    $set: {
      Events: {
        $map: {
          input: "$Events",
          in: {
            $mergeObjects: [
              "$$this",
              {
                Payload: {
                  $mergeObjects: [
                    "$$this.Payload",
                    {
                      Body: {
                        $mergeObjects: [
                          "$$this.Payload.Body",
                          {
                            Info: {
                              $mergeObjects: [
                                "$$this.Payload.Body.Info",
                                {
                                  DocumentSaleMargin: "$$this.Payload.Body.Info.DocumentMarkupOnNetCost",
                                  Lines: {
                                    $map: {
                                      input: "$$this.Payload.Body.Info.Lines",
                                      as: "l",
                                      in: {
                                        $mergeObjects: [
                                          "$$l",
                                          {
                                            LineSaleMargin: "$$l.LineMarkupOnNetCost"
                                          }
                                        ]
                                      }
                                    }
                                  }
                                }
                              ]
                            }
                          }
                        ]
                      }
                    }
                  ]
                }
              }
            ]
          }
        }
      }
    }
  },
  {
    $unset: [
      "Events.Payload.Body.Info.DocumentMarkupOnNetCost",
      "Events.Payload.Body.Info.DocumentMarkupAmountOnNetCost",
      "Events.Payload.Body.Info.Lines.LineMarkupOnNetCost",
      "Events.Payload.Body.Info.Lines.LineMarkupAmountOnNetCost"
    ]
  }
])

游乐场

警告:在直接在生产环境中执行之前,请先在本地进行测试!

© www.soinside.com 2019 - 2024. All rights reserved.