我是MongDB的新手,想要使用MongoDB查询更改下面的集合结构:
{
[{"id": "raymond_A",
"name":"Raymond",
"node_updated": 1,
"company": "A",
"token": 50,
"time": 152232854211,
“links”: ["jason_C", "nick_D" ]
},
{"id": "nik_B",
"name": "Nik",
"node_updated": 1,
"company": ”B”,
"token": 40,
"node_time": 1522328542551,
"links": ["peter_E", "raymond_A"]
}]
}
使得查询的最终输出变为如下所示。本质上,它拆分链接,使每个文档的id成为字段“source”,而链接被展平并成为“target”字段。
{
"nodes": [
{"id": "raymond_A”, "name":"Raymond", "node_updated": 1, "company": “A”, "token": 50, “node_time”: 152232854211},
{"id": "nik_B”, "name": "Nik", "node_updated": 1, "company”:”B”, "token": 40, "node_time": 1522328542551},
],
"links": [
{"source": "raymond_A", "target": "jason_C", "link_time": 1522328542561},
{"source": "raymond_A", "target": "nick_D", "link_time": 1522328542561},
{"source": "nik_B", "target": "peter_E", "link_time": 1522328542561},
{"source": "nik_B", "target": "raymond_A", "link_time": 1522328542561}
]
}
请告知我是否可以提供任何其他信息。谢谢。
答案 0 :(得分:1)
尝试以下聚合:
db.col.aggregate([
{
$group: {
_id: null,
nodes: {
$push: { id: "$id", name: "$name", company: "$company", token: "$token", node_time: { $ifNull: [ "$node_time", "$time" ] } }
},
links: { $push: { links: "$links", id: "$id", link_time: { $ifNull: [ "$node_time", "$time" ] } } }
}
},
{
$project: {
_id: 0,
nodes: 1,
links: {
$reduce: {
input: "$links",
initialValue: [],
in: {
$concatArrays: [ "$$value", {
$map: {
input: "$$this.links",
as: "link",
in: {
source: "$$this.id",
target: "$$link",
link_time: "$$this.link_time"
}
}
} ]
}
}
}
}
}
])
基本上,您似乎希望将所有文档合并到一个结果中,因此您应该使用$group
,其值为_id
null
。然后很容易获得nodes
值,因为它在第一步后将是平面数组。问题在于链接,因为它是一个数组数组,因此您需要$map和$reduce来展平该字段。