将多个子文档合并到mongo

时间:2016-02-06 01:45:50

标签: mongodb mongodb-query aggregation-framework

我正在尝试查询MongoDB中的多个子文档并作为单个文档返回。 我认为聚合框架是可行的方法,但是,看不到它完全正确。

采取以下文档:

{
    "board_id": "1",
    "hosts": 
     [{
        "name": "bob",
        "ip": "10.1.2.3"
     },
    {
         "name": "tom",
         "ip": "10.1.2.4"
    }]
 }

{
    "board_id": "2",
    "hosts": 
    [{
        "name": "mickey",
        "ip": "10.2.2.3"
    },
    {
        "name": "mouse",
        "ip": "10.2.2.4"
    }]
}

{
     "board_id": "3",
     "hosts": 
    [{
        "name": "pavel",
        "ip": "10.3.2.3"
    },
    {
        "name": "kenrick",
        "ip": "10.3.2.4"
     }]
}

尝试获取这样的查询结果:

{
    "hosts": 
    [{
        "name": "bob",
        "ip": "10.1.2.3"
    },
    {
         "name": "tom",
         "ip": "10.1.2.4"
    },
    {
         "name": "mickey",
         "ip": "10.2.2.3"
    },
    {
        "name": "mouse",
        "ip": "10.2.2.4"
    }, 
    {
         "name": "pavel",
         "ip": "10.3.2.3"
     },
     {
        "name": "kenrick",
        "ip": "10.3.2.4"
     }]
}

我试过这个:

db.collection.aggregate([ { $unwind: '$hosts' }, { $project : { name: 1, hosts: 1, _id: 0 }} ])

但这不是我想要的。

2 个答案:

答案 0 :(得分:1)

所以你的基本问题是数组包含在不同的文档中。因此,虽然您对要处理的数组$unwind是正确的,但为了将内容整合到一个数组中,您需要$group跨文档的结果,并$push将内容添加到文档中结果数组:

db.collection.aggregate([
    { "$unwind": "$hosts" },
    { "$group": {
        "_id": null,
        "hosts": { "$push": "$hosts" }
    }}
])

正如$unwind将"解构"数组元素,$push中的$group累加器带来"重建"数组。而且因为没有其他关键的" group" on,这会将所有元素组合成一个数组。

请注意,null分组键仅在结果文档不超过BSON限制时才真正实用。否则,最好将各个元素作为文档保留。

如果需要,可以选择删除_id $project

答案 1 :(得分:1)

你绝对可以用聚合来做到这一点。我们假设您的数据位于名为board的集合中,因此请将其替换为您的集合名称。

db.board.aggregate([
{$unwind:"$hosts"},
{$group:{_id:null, hosts:{$addToSet:"$hosts"}}},
{$project:{_id:0, hosts:1}}
]).pretty()

它会返回

    {
        "hosts" : [
            {
                "name" : "kenrick",
                "ip" : "10.3.2.4"
            },
            {
                "name" : "pavel",
                "ip" : "10.3.2.3"
            },
            {
                "name" : "mouse",
                "ip" : "10.2.2.4"
            },
            {
                "name" : "mickey",
                "ip" : "10.2.2.3"
            },
            {
                "name" : "tom",
                "ip" : "10.1.2.4"
            },
            {
                "name" : "bob",
                "ip" : "10.1.2.3"
            }
        ]
    }
相关问题