我一直在使用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中使用了一个错误,那么在保持相同功能的同时适应的最佳方法是什么?谢谢!
答案 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;它按预期工作。