我有一个 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)
})
我不确定你的代码有什么问题,但你需要通过打印值来调试自己,
知识的另一种选择:
您可以使用带有聚合管道的更新通过查询来完成此操作,但这取决于集合和文档的大小。
第一阶段循环
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"
]
}
])
警告:在直接在生产环境中执行之前,请先在本地进行测试!