【发布时间】:2021-09-17 11:15:12
【问题描述】:
设想一个集合,该集合在聚合的 $match 运算符上返回具有此结构的文档数组
A = {
slug:'a',
Rs:[{
_id:'foo',
attr2:'bar'
}]
}
所以基本上每个返回的文档都共享一个 slug(这就是我将它们分组的方式)但每个文档都有一个子文档数组,每个子文档都有不同的 _id。
因此,当我使用 {slug:"a"} 执行 $match 聚合时,它会返回一个 [A0,A1,A2...] 等数组,它们都共享相同的 slug。我正在调用每个文档 A
接下来在管道中,我将它们分组并希望查看它们的 Rs 数组
{
$group:{
_id:'$slug',
arrays:{$push:'$rs'}
}
}
这会返回一个看起来像这样的单个文档
{
_id:"a",
arrays: [
[{_id:'foo',attr2:'bar'},{_id:'foo2',attr2:'beer'}], //The arrays of document A0
[*A1 arrays*], //the arrays of document A1
[*A2 arrays*]
]
}
所以这是将我的所有文档分组为一个,并将它们的子文档数组作为子数组放在我的分组文档中,这是一个数组数组arrays:[[A0Rs0,A0Rs1],[A1Rs0,A1Rs1],[A2Rs0,etc]]
我的总体目标是连接或展平这些数组,因此我有一个包含所有值的数组,而不是数组数组,理想情况下我希望使用聚合运算符来做到这一点。因此,我最终不会像上面那样以数组数组结束,而是以
{
_id:"a",
arrays:[
{},{},{}... //all of the arrays. In fact these dont even have to be objects, I am after just the ID field of each object
]
}
我尝试了 $concatArrays 和其他运算符的组合,不确定是否需要在 $group 之前添加其他步骤或聚合器或如何处理。
我希望我的解释不会太混乱,如果有人能想到一种方法,我将非常感谢您的帮助!
【问题讨论】:
标签: arrays mongodb mongoose aggregation-framework