有没有办法在MongoDB中将两个数组合并为一个单独的数组?

时间:2017-07-25 13:31:16

标签: javascript arrays mongodb merge

我在MongoDB中有点新,我无法完成某项任务。我试着解释一下。

这是我的收藏:

'workers': [
    {
        _id: ObjectId(...),
        name: 'John',
        skills: [
            { id: ObjectId('111'), value: 2 },
            { id: ObjectId('222'), value: 3 },
            { id: ObjectId('333'), value: 4 },
        ]
    },
    {
        _id: ObjectId(...),
        name: 'Mary',
        skills: [
            { id: ObjectId('222'), value: 5 },
            { id: ObjectId('333'), value: 2 },
            { id: ObjectId('444'), value: 3 },
        ]
    },
    ...
]

我想要达到的目标是:

result: [
    allSkills: [
        { id: ObjectId('111'), value: 2 },
        { id: ObjectId('222'), value: 5 },
        { id: ObjectId('333'), value: 4 },
        { id: ObjectId('444'), value: 3 }
    ]
]

我的结果应该是一个包含workers集合内所有技能的单个数组(最终我会过滤它们)。

在示例中,我显示了我的最终结果,每个技能只有唯一值和更大value,但我在这里尝试实现的只是合并所有{{1数组成一个skills数组。目前,我得到的是一份文档列表,每个文档都有allSkills数组。

提前致谢。

2 个答案:

答案 0 :(得分:3)

这样的东西?:

db.collection.distinct('skills');

distinct api docs here!

另外,如果您只想获得技能对象的支柱,例如“值”,您可以这样做:

db.collection.distinct('skills.value');
希望它有所帮助。

答案 1 :(得分:1)

我接受了塞巴斯蒂安·埃斯皮诺萨的回答,因为它回答了我的问题。但仅仅是为了记录,我最终使用了另一种解决方案,我将把这里放在未来的参考资料中:

db.workers.aggregate([
    { $unwind: "$skills" },
    {
        $group: {
            _id: '$skills.id',
            value: { $max: '$skills.value' }
        }
    }
])

产生了结果:

result: [
    { id: ObjectId('111'), value: 2 },
    { id: ObjectId('222'), value: 5 },
    { id: ObjectId('333'), value: 4 },
    { id: ObjectId('444'), value: 3 }
]

这里的宝藏位于$unwind运算符上,这有助于实际合并skills数组。

我没有使用明确答案的原因是因为我无法将其发展到我想要的最终结果,但正如我所说,它完全回答了我原来的问题。