Mongodb $ nearSphere with skip and limit in 2.4.3 vs. 2.6.1

时间:2014-06-20 17:24:08

标签: mongodb

我一直在使用mongodb 2.4.3作为社交网络应用程序,它根据与调用者的距离返回配置文件。我使用$ nearSphere运算符如下:

db.profiles.find({loc: {$nearSphere: <lon, lat>}} ...).skip(0).limit(100);

我知道$ nearSphere运算符只返回100个结果,但它确实按距离排序结果集,这是我需要的,因为我的应用程序页面无论如何都会产生100的倍数,我能够遍历配置文件按距离列出,只需增加跳过值,如下所示:

db.profiles.find({loc: {$nearSphere: <lon, lat>}} ...).skip(100).limit(100);
db.profiles.find({loc: {$nearSphere: <lon, lat>}} ...).skip(200).limit(100);
db.profiles.find({loc: {$nearSphere: <lon, lat>}} ...).skip(300).limit(100);

这已经有效了大约一年。我最近升级到2.6.1,并注意到现在,无论我传递什么跳过值,只返回前100个结果。我已经不得不降级回v2.4.3以恢复此功能。

我的问题是,这种行为是2.4.3中的错误,还是2.6.1中的错误?据我所知,文档没有提到这种变化。如果我碰巧在2.4.3中使用了一个错误,那么在保持相同功能的同时适应的最佳方法是什么?谢谢!

1 个答案:

答案 0 :(得分:3)

您声明的100限制仅适用于&#39; 2d&#39;索引,所以我想你正在使用&#39; 2d&#39;指数。从我在2.6.3版本(和2.6.0,在我更新到最新版本之前)中测试的内容看来,这个特定查询的限制没有考虑到跳过的错误,所以如果你跳过100,你应该限制100 + limit

重现(在mongo客户端中):

db.test.drop();
db.test.ensureIndex({point: "2d"});
for (var i = 0; i < 200; ++i) { 
  db.test.insert({point:[1,2]});
}
db.test.insert({point:[1,2.01]});
db.test.find({point: {$nearSphere: [1,2]}}).skip(200).limit(201);

返回:

  

{&#34; _id&#34; :ObjectId(&#34; 53a476c6c83c83ebdd121038&#34;),&#34; point&#34; :[1,2.01]}

当你

db.test.find({point: {$nearSphere: [1,2]}}).skip(200).limit(1);

没有。

用于比较,当你

db.test.find({}).skip(200).limit(1)

它返回

  

{&#34; _id&#34; :ObjectId(&#34; 53a476c6c83c83ebdd121038&#34;),&#34; point&#34; :[1,2.01]}

for&#39; 2dsphere&#39;它按预期工作。