我是mongodb的最新版本(2.6.3我相信)。
我有以下聚合:
{
"$project": {
"summary": 1,
"priority": 1,
"sortDate": {
"$ifNull": [
"$targetDate",
"$deadlineDate"
]
}
}
},
{
"$sort": {
"priority": -1,
"sortDate": 1
}
}
集合中的某些对象同时targetDate
和deadlineDate
未定义。
现在这是奇怪的事情。如果我运行这个,我会全部回来:
优先级为3
一个优先级为2且没有sortDate
另一个优先级为2且没有sortDate
优先级为2且sortDate(顺序正确)的
... etc priority 1
我理解为什么未定义在有价值之前,即使我不喜欢它。但是,如果我添加
{“$ limit”:2}
到聚合管道,我希望从上面的列表中找回 1和2 。 我回来了1和3 !!!!怎么样?
这导致了进一步的怪异;如果我使用skip / limit页面,一些项目将出现在多个页面上,导致客户端对象跟踪器发生故障并崩溃,但我确实将此排序异常作为所有这些问题的根本原因。
答案 0 :(得分:1)
让我根据评论澄清一些我认为可能潜伏的误解:
$limit
是一个管道阶段,始终将管道中的文档数量减少到最多指定的数量。关于它影响搜索的内容并没有什么棘手的问题。与"返回"。它只是一个流水线阶段,通过摆脱所有的文档将一组文档转换为另一组文档> n当限制参数为n
时,按文档呈现给它的顺序排列。请注意,订单可能没有多大意义。我们将在一秒钟内讨论这个棘手的问题:D
聚合查询返回的结果为$limit
并不是错误的;它只是与众不同。两者都有相同的排序键,所以如果两个管道分别返回123和132,你真的不能抱怨,然后限制2分别给你12和13。我理解,如果您稍后在其他字段上继续使用$match
等,结果可能会令人惊讶,但您无法说输出错误。
至于我们为什么看到13而不是12的解释,我的猜测是它与$sort
+$limit
coalescence有关。该限制会影响排序的发生方式,从而有效地提前退出。我的猜测是,因为它早先退出,它从不考虑2,当它被认为没有$limit
时,它被排序在3之前(它们具有相同的排序键,所以它并不重要它放了。)
如果您发布示例文档和完整的聚合管道,或许可以说有更多可以帮助您,但这是我根据我所看到的猜测。