我目前正在开发一个应用程序,如果他们的位置坐标落在一定的距离范围内,它会从集合中获取特定数量的文档。我正在使用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 - 使用限制跳过的文件并不总是相同的&产生随机结果
答案 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/)