Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 对辅助字段进行排序和限制的地理空间查询_Mongodb_Sorting_Limit_Geospatial - Fatal编程技术网

Mongodb 对辅助字段进行排序和限制的地理空间查询

Mongodb 对辅助字段进行排序和限制的地理空间查询,mongodb,sorting,limit,geospatial,Mongodb,Sorting,Limit,Geospatial,我正在尝试获取最近在附近地区创建的3个帐户。 因此,我尝试使用地理空间查询与排序(在:-1处创建)和限制(3)相结合 基本地理空间查询: db.users.find({"loc": {$near: [28.41, 77.04], $maxDistance:0.05, $uniqueDocs: true}}) { "created_at" : ISODate("2013-12-11T07:58:34.927Z"), "name" : "A" } { "created_at" : ISODate("

我正在尝试获取最近在附近地区创建的3个帐户。 因此,我尝试使用地理空间查询与排序(在:-1处创建)和限制(3)相结合

基本地理空间查询:

db.users.find({"loc": {$near: [28.41, 77.04], $maxDistance:0.05, $uniqueDocs: true}})
{ "created_at" : ISODate("2013-12-11T07:58:34.927Z"), "name" : "A" }
{ "created_at" : ISODate("2014-03-08T10:00:17.921Z"), "name" : "B" }
{ "created_at" : ISODate("2014-03-13T08:28:46.285Z"), "name" : "C" }
{ "created_at" : ISODate("2014-03-05T12:01:34.199Z"), "name" : "D" }
{ "created_at" : ISODate("2014-03-13T08:16:22.913Z"), "name" : "E" }
{ "created_at" : ISODate("2014-03-13T10:23:02.660Z"), "name" : "F" }
将排序添加到它会得到:

db.users.find({"loc": {$near: [28.41, 77.04], $maxDistance:0.05, $uniqueDocs: true}}).sort({created_at: -1})
{ "created_at" : ISODate("2014-03-13T10:23:02.660Z"), "name" : "F" }
{ "created_at" : ISODate("2014-03-13T08:28:46.285Z"), "name" : "C" }
{ "created_at" : ISODate("2014-03-13T08:16:22.913Z"), "name" : "E" }
{ "created_at" : ISODate("2014-03-08T10:00:17.921Z"), "name" : "B" }
{ "created_at" : ISODate("2014-03-05T12:01:34.199Z"), "name" : "D" }
{ "created_at" : ISODate("2013-12-11T07:58:34.927Z"), "name" : "A" }
最后加上一个限制:

db.users.find({"loc": {$near: [28.41, 77.04], $maxDistance:0.05, $uniqueDocs: true}}).sort({created_at: -1}).limit(3)
{ "created_at" : ISODate("2014-03-13T08:28:46.285Z"), "name" : "C" }
{ "created_at" : ISODate("2014-03-08T10:00:17.921Z"), "name" : "B" }
{ "created_at" : ISODate("2013-12-11T07:58:34.927Z"), "name" : "A" }
预期结果为[F,C,E](即第二个查询结果的前3个条目)。但是我得到的是[C,B,A],这是第一个查询结果的前3个条目(按创建时间排序)

因此,mongodb在执行排序操作之前先执行限制操作。有没有办法强制它在应用限制之前进行排序

提出了一个类似的问题,但查询本身存在一个问题。 此问题是否特定于“$near”查询?

该查询已对距离最近的文档进行排序。因此,如果您有一个额外的sort()和limit(),则首先应用limit(),因为结果已经按距离排序


虽然我认为在地理空间查询中按“created_at”排序没有多大意义,但如果您仍然需要它,则只能通过编程方式进行排序。也就是说,对查询中的整个结果进行排序,并在客户端程序中应用限制。

使用$GEOIN help是否也可以?与$near完全不同。它们不能互换使用。它们的用例完全不同。您可以在文档中阅读。我建议在您的客户机程序中对您描述的用例应用限制。我知道,但我的用例只需要按创建进行排序。地理空间查询只需要确保结果位于maxDistance范围内。所以我可以使用$geoinse而不是$near。谢谢,把你的答案标记为正确