【发布时间】:2020-01-23 16:14:57
【问题描述】:
我正在尝试查找与特定条件匹配的所有记录,在本例中 _id 是特定值,然后仅返回前 2 个结果,按名称字段排序。
这就是我所拥有的
db.getCollection('col1').aggregate([
{$match: {fk: {$in: [1, 2]}}},
{$sort: {fk: 1, name: -1}},
{$group: {_id: "$fk", items: {$push: "$$ROOT"} }},
{$project: {items: {$slice: ["$items", 2]} }}
])
它有效,但不能保证。根据this Mongo thread$group不保证文件顺序。
这也意味着此处和其他地方的所有建议解决方案,即建议使用$unwind,然后是$sort,然后是$group,出于同样的原因也将不起作用。
使用 Mongo(任何版本)完成此任务的最佳方法是什么?我看到了可以在$project 阶段完成的建议,但我不太确定如何。
【问题讨论】:
-
只是为了测试,是否可以包含一些示例数据? $group 之后的 $sort 也会起作用吗?
-
好的,我找不到任何未在组中结束的解决方案。
-
我认为您可能对那个文档点感到困惑。虽然
$group确实不能保证生成的“分组”文档的任何输出顺序,但当您按照自己的方式做某事时,$sortbefore 实际上是$group然后 项目将以相同的排序顺序添加到数组中。这自然是保证,否则实现$sort将毫无意义。 -
所以
{ "a": 1, "b": 2 }, { "a": 1, "b": 1 }, { "a": 2, "b": 3 }确实会可能 收集,以便_id: "$a"分组键的顺序可能不同,即“分组”中的 2 在 1 之前,但如果你做了类似[{ "$sort": { "a": 1, "b": 1 }},{ "$group": { "_id": "$a", "list": { "$push": "$b" } } }]然后list按排序顺序总是,即使_id键值不是。在最初应用$sort之后,没有什么会导致“推送”数组元素处于任何意外顺序。
标签: mongodb aggregation-framework