mongodb获得与类别不同的​​值

时间:2017-05-17 09:57:19

标签: mongodb mongodb-query aggregation-framework

假设有以下集合

人:

{
    _id: 1,
    name: 'john',
    last_name: 'blah1',
    job: 'lifeguard'
}
{
    _id: 2,
    name: 'john',
    last_name: 'blah2',
    job: 'lifeguard'
}
{
    _id: 3,
    name: 'alex',
    last_name: 'blah3',
    job: 'lifeguard'
}
{
    _id: 4,
    name: 'alex',
    last_name: 'blah4',
    job: 'lifeguard'
}
{
    _id: 5,
    name: 'alex',
    last_name: 'blah5',
    job: 'gardener'
}

我需要使用一系列令人分心的名字来获取distict作业:

尝试获得以下结果:

[
    {
        value: 'lifeguard',
        names: [
            'john',
            'alex'
        ],
    },
    {
        value: 'gardener',
        names: [
            'alex'
        ],
    },
]

我了解如何获得独特的工作

db.people.find().distinct('jobs')

但是,我没有弄清楚如何使用多个属性进行不同的查询。

2 个答案:

答案 0 :(得分:3)

最好使用聚合框架,其中有一个具有 $group 阶段的管道,通过作业键对文档进行分组,然后在组中构建名称distinct数组。累加器 $addToSet

考虑以下聚合操作:

db.people.aggregate([
    {
        "$group": {
            "_id": "$job",
            "names": { "$addToSet": "$name" }
        }
    }
])

答案 1 :(得分:0)

@chridam确实帮我找到了正确的答案,在现实世界中我的对象更像是

{
    _id: 1,
    name: ['john', 'bah1', 'blah2', 'blah3'],
    last_name: 'blah1',
    job: 'lifeguard'
}

所以我必须$unwind这些名字和汇总$ group就像@ chridam的答案一样。

model.aggregate([
    {$unwind: "$name"},
    {
        $group: {
            _id:"$name",
            jobs: {
                $addToSet: "$job"
            }
        }
    }
]