MongoDB .limit()忽略.sort()?

时间:2014-11-27 09:55:20

标签: mongodb

在MongoDB 2.6.5上使用mongo shell运行查询

问题:.limit()似乎忽略.sort()。

这是常规行为吗?我不认为这样做但我不确定。如果没有,是否有办法通过排序然后限制而不是限制然后排序来使其工作。

我正在运行以下查询

  

db.post.find({categories:{$ in:[“101”]},location:{$ near:[1.310000,103.700000],$ maxDistance:0.449964},dateExpire:{$ gte:ISODate(“ 2014-11-27T00:00:00Z“)},defunctInd:null},{_ id:1,dateCreated:1})。sort({dateCreated:-1})。limit(5);

这就是结果(日期不按下面排序列表的顺序排列)

  

{“_ id”:ObjectId(“5473df733a0da831248b4567”),“dateCreated”:ISODate(“2014-11-25T01:46:26.059Z”)}

  {“_ id”:ObjectId(“546ea9f63a0da8725b8b4725”),“dateCreated”:ISODate(“2014-11-21T02:56:51.143Z”)}

  {“_ id”:ObjectId(“546da7503a0da856058b4633”),“dateCreated”:ISODate(“2014-11-20T08:33:18.504Z”)}

  {“_ id”:ObjectId(“546da6943a0da8725b8b469a”),“dateCreated”:ISODate(“2014-11-20T08:30:10.779Z”)}

  {“_ id”:ObjectId(“546da5c53a0da8725b8b4667”),“dateCreated”:ISODate(“2014-11-20T08:26:42.299Z”)}

当我运行上述查询时没有限制

  

db.post.find({categories:{$ in:[“101”]},location:{$ near:[1.310000,103.700000],$ maxDistance:0.449964},dateExpire:{$ gte:ISODate(“ 2014-11-27T00:00:00Z“)},defunctInd:null},{_ id:1,dateCreated:1})。sort({dateCreated:-1})

这是结果

  

{“_ id”:ObjectId(“5476accd3a0da8681d8b4596”),“dateCreated”:ISODate(“2014-11-27T04:47:07.078Z”)}

  {“_ id”:ObjectId(“5476ac783a0da8a91d8b4577”),“dateCreated”:ISODate(“2014-11-27T04:45:41.940Z”)}

  {“_ id”:ObjectId(“5476aaba3a0da8681b8b45b7”),“dateCreated”:ISODate(“2014-11-27T04:38:15.751Z”)}

  {“_ id”:ObjectId(“5476a9e63a0da8751d8b4567”),“dateCreated”:ISODate(“2014-11-27T04:34:42.835Z”)}

  {“_ id”:ObjectId(“5473df733a0da831248b4567”),“dateCreated”:ISODate(“2014-11-25T01:46:26.059Z”)}

  {“_ id”:ObjectId(“5472f78f3a0da808608b47b8”),“dateCreated”:ISODate(“2014-11-24T09:17:01.723Z”)}

  {“_ id”:ObjectId(“5472cc0c3a0da8725b8b4765”),“dateCreated”:ISODate(“2014-11-24T06:11:22.772Z”)}

  {“_ id”:ObjectId(“547278bb3a0da8705b8b47b2”),“dateCreated”:ISODate(“2014-11-24T00:15:53.478Z”)}

  {“_ id”:ObjectId(“547012413a0da8705b8b4780”),“dateCreated”:ISODate(“2014-11-22T04:34:07.992Z”)}

  {“_ id”:ObjectId(“5470110a3a0da8705b8b477f”),“dateCreated”:ISODate(“2014-11-22T04:28:55.778Z”)}

  {“_ id”:ObjectId(“546ea9f63a0da8725b8b4725”),“dateCreated”:ISODate(“2014-11-21T02:56:51.143Z”)}

  {“_ id”:ObjectId(“546def203a0da8565b8b464a”),“dateCreated”:ISODate(“2014-11-20T13:39:43.413Z”)}

  {“_ id”:ObjectId(“546deb693a0da856058b4649”),“dateCreated”:ISODate(“2014-11-20T13:23:50.985Z”)}

  {“_ id”:ObjectId(“546da9cc3a0da856058b4647”),“dateCreated”:ISODate(“2014-11-20T08:43:54.626Z”)}

  {“_ id”:ObjectId(“546da8733a0da808608b46ec”),“dateCreated”:ISODate(“2014-11-20T08:38:09.092Z”)}

由于

1 个答案:

答案 0 :(得分:4)

弄清楚我的问题。

$ near不适用于$ sort。因此,当我放置$ limit时,$ sort的原因总是被忽略,除非$ limit大到足以包含所有结果。它将按近似值排序,距离最近距离。

解决方案是使用$ geoWithin。 http://docs.mongodb.org/manual/reference/operator/query/geoWithin/#op._S_geoWithin

这适用于$ sort。在我的圆圈中,这是替换代码位置:{$ geoWithin:{$ center:[[1.310000,103.700000],0.449964]}}