mongodb:$ sort和$ limit在undefined中表现得很奇怪

时间:2014-07-31 12:01:13

标签: mongodb

我是mongodb的最新版本(2.6.3我相信)。

我有以下聚合:

{
   "$project": {
        "summary": 1,  
        "priority": 1,
        "sortDate": {
           "$ifNull": [
              "$targetDate",
              "$deadlineDate"
           ]
        }
   }
},
{
  "$sort": {
      "priority": -1,
      "sortDate": 1
   }
}

集合中的某些对象同时targetDatedeadlineDate未定义。

现在这是奇怪的事情。如果我运行这个,我会全部回来:

  1. 优先级为3

  2. 的人
  3. 一个优先级为2且没有sortDate

  4. 另一个优先级为2且没有sortDate

  5. 的人
  6. 优先级为2且sortDate(顺序正确)的

  7. ... etc priority 1

  8. 我理解为什么未定义在有价值之前,即使我不喜欢它。但是,如果我添加

      

    {“$ limit”:2}

    到聚合管道,我希望从上面的列表中找回 1和2 我回来了1和3 !!!!怎么样?

    这导致了进一步的怪异;如果我使用skip / limit页面,一些项目将出现在多个页面上,导致客户端对象跟踪器发生故障并崩溃,但我确实将此排序异常作为所有这些问题的根本原因。

1 个答案:

答案 0 :(得分:1)

让我根据评论澄清一些我认为可能潜伏的误解:

  1. $limit是一个管道阶段,始终将管道中的文档数量减少到最多指定的数量。关于它影响搜索的内容并没有什么棘手的问题。与"返回"。它只是一个流水线阶段,通过摆脱所有的文档将一组文档转换为另一组文档> n当限制参数为n时,按文档呈现给它的顺序排列。请注意,订单可能没有多大意义。我们将在一秒钟内讨论这个棘手的问题:D

  2. 聚合查询返回的结果为$limit并不是错误的;它只是与众不同。两者都有相同的排序键,所以如果两个管道分别返回123和132,你真的不能抱怨,然后限制2分别给你12和13。我理解,如果您稍后在其他字段上继续使用$match等,结果可能会令人惊讶,但您无法说输出错误。

  3. 至于我们为什么看到13而不是12的解释,我的猜测是它与$sort+$limit coalescence有关。该限制会影响排序的发生方式,从而有效地提前退出。我的猜测是,因为它早先退出,它从不考虑2,当它被认为没有$limit时,它被排序在3之前(它们具有相同的排序键,所以它并不重要它放了。)

    如果您发布示例文档和完整的聚合管道,或许可以说有更多可以帮助您,但这是我根据我所看到的猜测。