不完全確定如何在不混淆每個人的情況下表達這一點..我嘗試了一些“組”和專案“但沒有走得太遠..但是,鑒于以下物件:
[
{
"id": "61dbd1aef1eabf8d2dc9ac04",
"name": "node01",
"changeLog": [
{
"timestamp": "2014-09-27T03:00:00Z",
"change": [
{
"type": "update",
"path": [
"node01",
"name"
],
"from": "",
"to": "test"
},
{
"type": "update",
"path": [
"node01",
"size"
],
"from": "tiny",
"to": "small"
}
]
},
{
"timestamp": "2015-09-27T03:00:00Z",
"change": [
{
"type": "update",
"path": [
"node01",
"name"
],
"from": "test",
"to": "prod01"
},
{
"type": "update",
"path": [
"node01",
"size"
],
"from": "",
"to": "medium"
}
]
},
]
}
]
我如何創建一個聚合管道,將每個物件的“父”時間戳放入其子陣列中,然后將其合并到一個物件陣列中。即
[
{
"id":"61dbd1aef1eabf8d2dc9ac04",
"name":"node01",
"changeLog":[
{
"change":[
{
"timestamp":"2014-09-27T03:00:00Z",
"type":"update",
"path":[
"node01",
"name"
],
"from":"",
"to":"test"
},
{
"timestamp":"2014-09-27T03:00:00Z",
"type":"update",
"path":[
"node01",
"size"
],
"from":"",
"to":"sm"
},
{
"timestamp":"2015-09-27T03:00:00Z",
"type":"update",
"path":[
"node01",
"name"
],
"from":"test",
"to":"prod01"
},
{
"timestamp":"2015-09-27T03:00:00Z",
"type":"update",
"path":[
"node01",
"size"
],
"from":"small",
"to":"medium"
}
]
}
]
}
]
非常感謝您的幫助!
uj5u.com熱心網友回復:
詢問
- 嵌套地圖添加時間戳
- 在檔案中添加更新的欄位(
timestamp),mergeObjects用于 - 減少以將所有陣列合并為 1 個包含所有更改的陣列
*所有更改都轉到 1 個陣列,所以你真的不需要嵌套陣列,所以查詢會產生 1 個不嵌套的陣列,如果你想讓它像 1 個元素的 1 個陣列一樣嵌套,你可以$set在 1 個階段完成,我沒有這樣做因為我認為它像這樣更簡單。
*如果您想更新而不僅僅是聚合,您可以使用更新管道,例如
update({},[...pipeline_bellow...],{"multi" : true})
測驗代碼在這里
aggregate(
[{"$set":
{"changeLog":
{"$map":
{"input":"$changeLog",
"in":
{"$map":
{"input":"$$log.change",
"in":
{"$mergeObjects":["$$ch", {"timestamp":"$$log.timestamp"}]},
"as":"ch"}},
"as":"log"}}}},
{"$set":
{"changeLog":
{"$reduce":
{"input":"$changeLog",
"initialValue":[],
"in":{"$concatArrays":["$$value", "$$this"]}}}}}])
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/410190.html
標籤:
