Mongo查询:展平字段并拆分为新文档

时间:2018-04-24 02:48:01

标签: mongodb d3.js

我是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}
  ]
}

请告知我是否可以提供任何其他信息。谢谢。

1 个答案:

答案 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来展平该字段。