经过一些汇总后,我只有一个这样的文档:
{
a:[3,5,8,1,...],
b:[5,2,6,5,...],
c:[2,6,3,1,...]
}
最好的获取方法是:
{
a:[1,2,3,4,...],
b:[1,2,3,4,...],
c:[1,2,3,4,...]
}
我需要对它进行排序以进行其他聚合,因此不能使用find
or update
。
我得到的最接近的有效解决方案是以下聚合:
[
{
$facet: {
a: [
{ $unwind: '$a' },
{ $sort: { a: 1 } },
{
$group: {
_id: '$_id',
a: { $push: '$a' }
}
}
],
b: [
{ $unwind: '$b' },
{ $sort: { b: 1 } },
{
$group: {
_id: '$_id',
b: { $push: '$b' }
}
}
],
c: [
{ $unwind: '$c' },
{ $sort: { c: 1 } },
{
$group: {
_id: '$_id',
c: { $push: '$c' }
}
}
]
}
},
{
$set: {
a: { $arrayElemAt: ['$a.a', 0] },
b: { $arrayElemAt: ['$b.b', 0] },
c: { $arrayElemAt: ['$c.c', 0] }
}
}
]
简而言之,这样做是:$facet
在每个执行相同的操作a
,b
,c
在平行场; 每个字段均以分隔$unwind
,并按升序排序,然后对其进行分组。
到目前为止,我们已经对字段进行了排序,但是每个字段现在都是具有适当名称(例如{ _id: '', a: [...] }
)的对象。因此,要返回到我们前面的数组,另一阶段是仅从每个对象中仅提取所需的字段。这是通过$set
和$arrayElemAt
(需要第一个数组字段)完成的。因此,最后,我们将每个字段以升序排序,同时拥有相同数量的文档。
注意:仅当您有一个结果文档时,此方法才有效。如果其中有多个,则需要稍微更改阶段:
$facet
阶段保持不变$set
(第二)阶段更改为:使用$unwind
+更新$set
为每个单独场阶段(在这种情况下,我们有a
,b
,c
):
{ $unwind: '$a' },
{ $unwind: '$b' },
{ $unwind: '$c' },
{ $set: { a: '$a.a' } },
{ $set: { b: '$b.b' } },
{ $set: { c: '$c.c' } }
这可能不是最漂亮的方法,但是我找不到较短的版本。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句