我的收藏的结构是这样的:
[
{ 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]
”?或者,或者,如何使用其他方法实现所需的输出?
答案 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'] }
] }
} }
希望这对某人有帮助。欢迎提供其他答案/重复副本的链接(我在任何地方都找不到我的案子...)