在 MongoDB 中,当有超过 100 条记录时,如何对 2d 索引 $near 查询进行排序?
In MongoDB, how can I sort a 2d indexed $near query when there are over 100 records?
我有一个查询使用 $near
将记录过滤到接近程度。然后应该按单独的字段对结果进行排序。然而,我 运行 遇到记录丢失的情况,即使它们符合条件。
我怀疑这是因为使用 $near
和 2d
索引有 100 条记录的限制。我认为正在发生的事情是地理空间排序首先发生,然后我才应用于该结果的前 100 条记录。
有没有办法克服这种行为?我可以忽略 $near
的排序并使用我自己的排序作为主要排序,或者绕过 100 条记录的限制以便我的排序适用于整个集合吗?
这是我正在使用的查询中的 explain()
:
db.properties.find({
loc: {
$near: [-80.173366, 34.07868],
$maxDistance: 5
}}).sort({mls: -1}).explain()
{
"cursor" : "GeoSearchCursor",
"isMultiKey" : false,
"n" : 100,
"nscannedObjects" : 211,
"nscanned" : 700,
"nscannedObjectsAllPlans" : 211,
"nscannedAllPlans" : 700,
"scanAndOrder" : true,
"indexOnly" : false,
"nYields" : 1,
"nChunkSkips" : 0,
"millis" : 2,
"indexBounds" : {
},
"server" : "slate:27017",
"filterSet" : false
}
我运行前阵子遇到同样的问题,可以用聚合-$match。我在 hackaton 中使用了以下代码段。
db.kickstarter.aggregate(
{'$match' :
{geo2 :
{$geoWithin :
{ $centerSphere :[[parseFloat(lng), parseFloat(lat) ], radius/6371 ]
}
}
}
},
{$sort : {'pledged' : -1}},
{$limit : 1000}, //you can set your limit here
function(err, data){
if(err)console.log(err);
}
);
我有一个查询使用 $near
将记录过滤到接近程度。然后应该按单独的字段对结果进行排序。然而,我 运行 遇到记录丢失的情况,即使它们符合条件。
我怀疑这是因为使用 $near
和 2d
索引有 100 条记录的限制。我认为正在发生的事情是地理空间排序首先发生,然后我才应用于该结果的前 100 条记录。
有没有办法克服这种行为?我可以忽略 $near
的排序并使用我自己的排序作为主要排序,或者绕过 100 条记录的限制以便我的排序适用于整个集合吗?
这是我正在使用的查询中的 explain()
:
db.properties.find({
loc: {
$near: [-80.173366, 34.07868],
$maxDistance: 5
}}).sort({mls: -1}).explain()
{
"cursor" : "GeoSearchCursor",
"isMultiKey" : false,
"n" : 100,
"nscannedObjects" : 211,
"nscanned" : 700,
"nscannedObjectsAllPlans" : 211,
"nscannedAllPlans" : 700,
"scanAndOrder" : true,
"indexOnly" : false,
"nYields" : 1,
"nChunkSkips" : 0,
"millis" : 2,
"indexBounds" : {
},
"server" : "slate:27017",
"filterSet" : false
}
我运行前阵子遇到同样的问题,可以用聚合-$match。我在 hackaton 中使用了以下代码段。
db.kickstarter.aggregate(
{'$match' :
{geo2 :
{$geoWithin :
{ $centerSphere :[[parseFloat(lng), parseFloat(lat) ], radius/6371 ]
}
}
}
},
{$sort : {'pledged' : -1}},
{$limit : 1000}, //you can set your limit here
function(err, data){
if(err)console.log(err);
}
);