首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将多个子文档合并为mongo中的新文档。

将多个子文档合并为mongo中的新文档。
EN

Stack Overflow用户
提问于 2016-02-06 01:45:49
回答 2查看 1.2K关注 0票数 3

我试图在MongoDB中查询多个子文档,并作为一个文档返回。我认为聚合框架是可行的,但是,我看不出它是正确的。

请输入以下文档:

代码语言:javascript
运行
复制
{
    "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"
     }]
}

试图获得如下查询结果:

代码语言:javascript
运行
复制
{
    "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"
     }]
}

我试过这个:

代码语言:javascript
运行
复制
db.collection.aggregate([ { $unwind: '$hosts' }, { $project : { name: 1, hosts: 1, _id: 0 }} ])

但这不是我想要的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-02-06 02:10:54

你绝对可以用聚合来做这件事。让我们假设您的数据在集合中,名为board,所以请用您的集合名替换它。

代码语言:javascript
运行
复制
db.board.aggregate([
{$unwind:"$hosts"},
{$group:{_id:null, hosts:{$addToSet:"$hosts"}}},
{$project:{_id:0, hosts:1}}
]).pretty()

它会回来的

代码语言:javascript
运行
复制
    {
        "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"
            }
        ]
    }
票数 2
EN

Stack Overflow用户

发布于 2016-02-06 02:10:03

因此,这里的基本问题是数组包含在单独的文档中。因此,虽然您正确地将数组用于处理,但为了将内容带入单个数组,您需要跨文档对结果进行$unwind,并将内容$push到结果数组:

代码语言:javascript
运行
复制
db.collection.aggregate([
    { "$unwind": "$hosts" },
    { "$group": {
        "_id": null,
        "hosts": { "$push": "$hosts" }
    }}
])

因此,正如$unwind将“解构”数组元素一样,$group中的$push累加器将“重构”数组。而且,由于没有"group“on的其他键,所以这会将所有元素都带到一个数组中。

请注意,只有当生成的文档不超过BSON限制时,null分组键才是真正实用的。否则,最好将各个元素作为文档保留在文档中。

如果需要,可以选择使用附加的_id删除$project

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35236398

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档