MongoDB查询:使用Limit和$ near一起跳过几个文档

时间:2014-04-26 15:32:10

标签: mongodb geospatial

我目前正在开发一个应用程序,如果他们的位置坐标落在一定的距离范围内,它会从集合中获取特定数量的文档。我正在使用Codeigniter的活动记录库,生成的查询如下

db.updates.find({locs: { $near: [72.844102008984, 19.130207090604 ], $maxDistance: 5000 },  posted_on : { $lt :1398425538.1942 },}).sort( { posted_on: -1 } ).limit(10).toArray()

我面临的问题是上面的查询跳过了几个实际上应该被拉出的文档。但是,如果我从上面的查询中删除limit(10),则会提取适当的文档。

我不确定,但在MongoDB中使用limit()会忽略一些结果吗?或者仅限于最近(最近)的文件?

P.S - 使用限制跳过的文件并不总是相同的&产生随机结果

2 个答案:

答案 0 :(得分:1)

我怀疑你遇到了$ near查询的特殊性问题。 $ near在返回结果的光标上执行limit()和sort() -

  

指定地理空间查询首先返回最近文档的点。查询将文档从最近到最远排序。

     

默认情况下,使用2d索引的查询返回100个文档的限制;但是你可以使用limit()来改变结果的数量。

http://docs.mongodb.org/manual/reference/operator/query/near/

虽然文档明确讨论了使用您自己的限制调用覆盖100的限制

  

您可以使用cursor.limit()进一步限制结果数。

没有添加您自己的sort()或同时排序和覆盖限制。我怀疑你遇到了兼顾两者的副作用。请注意,同时执行这两项操作并不正确 - 它可能无法生成您要查找的结果。我建议使用$ geoWithin

尝试相同的查询

http://docs.mongodb.org/manual/reference/operator/query/geoWithin/

$ geoWithin不对结果应用排序或限制,因此它为您提供了更原始的结果集。

答案 1 :(得分:0)

系统中是否有任何相同的posted_on日期?我建议按第二个键排序,也许是_id。如果排序顺序是非确定性的,则系统可以跳过非确定性庄园中的文档。如果在其他字段上有索引,那么将_id字段添加到排序顺序通常并不昂贵,因为它们已经非常接近正确的顺序而_id是所有索引的一部分。 ("默认情况下,所有集合在_id字段上都有索引,应用程序和用户可以添加其他索引以支持重要的查询和操作。" http://docs.mongodb.org/manual/core/index-single/