对二级字段进行排序和限制的地理空间查询

时间:2014-03-25 11:57:40

标签: mongodb sorting limit geospatial

我正在尝试获取附近区域最近创建的3个帐户。 所以我尝试使用地理空间查询结合排序(created_at:-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在执行排序操作之前执行限制操作。在应用限制之前有没有办法强制它进行排序?

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

1 个答案:

答案 0 :(得分:2)

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

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