在MongoDB聚合$ addFields

时间:2018-12-11 21:55:46

标签: mongodb aggregation-framework

我的收藏的结构是这样的:

[
    { key: 'a', type: 'one', content: { ... } },
    { key: 'a', type: 'two', content: { ... } },
    { key: 'b', type: 'one', content: { ... } }
]

我需要一个返回以下内容的查询:

[
    { key: 'a', one: { ... }, two: { ... } },
    { key: 'b', one: { ... }, two: null }
]

two: null会是一个奖励,two只是没有定义,我也很满意。)

我开始按key进行分组聚合:

{ $group: { 
    _id: '$key',
    key: { $first: '$key' },
    contents: { $push: '$content' } 
} }

然后以为我可以做类似的事情:

{ $addFields: {
    one: '$contents[type=one]',
    two: '$contents[type=two]'
} }

但是显然它不能那样工作。我对$filter进行了一些实验,但无法使其正常工作。

我如何实现“ $contents[type=one]”?或者,或者,如何使用其他方法实现所需的输出?

1 个答案:

答案 0 :(得分:0)

在点击“发表您的问题”之前,我再次遇到了$arrayElemAt。我以前忽略了它,因为我以为我不知道索引,而是需要像$arrayElemWhere这样的东西,但它不存在。但是后来我意识到:完全有可能知道索引!方法如下:

在推动content的同时,也同时推动​​type

{ $group: { 
    _id: '$key',
    key: { $first: '$key' },
    contents: { $push: '$content' },
    types: { $push: '$type' }
} }

然后动态查询types数组中的索引,并在contents数组上使用它:

{ $addFields: {
    one: { $arrayElemAt: [
        '$contents',
        { $indexOfArray: ['$types', 'one'] }
    ] }
} }

希望这对某人有帮助。欢迎提供其他答案/重复副本的链接(我在任何地方都找不到我的案子...)