mongodb - mongo中将多个子文档合并成一个新文档

标签 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 }} ])

但这并不是我想要的。

最佳答案

你绝对可以用聚合来做到这一点。假设您的数据位于名为 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"
            }
        ]
    }

关于mongodb - mongo中将多个子文档合并成一个新文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35236398/

相关文章:

database - 我想通过在 mongodb 中按日期过滤来搜索

node.js - Mongoose 验证未调用

mongodb - 如何在分组时使用 $cond 检查同一数组中的空值进行聚合操作

Mongodb 项目结果放入单个文档

node.js - $facet 如何提高 $lookup 的性能

node.js - 如何使用nodejs在mongodb内上传多个文件

mongodb - 使用 Redis、MongoDB、ServiceStack 进行 .NET session 状态缓存

node.js - mongodb和nodejs根据当前值更新值

mongodb - MongoDB高级聚合

javascript - 聚合在控制台而不是 Node 中工作?