【问题标题】:geo-spatial query with sort and limit on a secondary field对辅助字段进行排序和限制的地理空间查询
【发布时间】:2014-05-03 06:09:14
【问题描述】:

我正在尝试获取附近地区最近创建的 3 个帐户。 所以我尝试使用结合 sort(created_at: -1) 和 limit(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在执行排序操作之前是先执行limit操作。有没有办法在应用限制之前强制它排序?

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

【问题讨论】:

    标签: mongodb sorting limit geospatial


    【解决方案1】:

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

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

    【讨论】:

    • 那么使用 $geoWithin 帮助可以吗?
    • $geoWithin 与 $near 完全不同。它们不能互换使用。它们的用例完全不同。您可以在文档中阅读有关它的信息。我建议在您的客户端程序中针对您描述的用例应用限制。
    • 我意识到这一点,但我的用例只需要按创建排序。地理空间查询只需要确保结果在 maxDistance 范围内。所以我可以在这里使用 $geoWithin 而不是 $near 。谢谢,将您的答案标记为正确
    猜你喜欢
    • 2013-10-22
    • 2023-03-29
    • 2021-04-26
    • 1970-01-01
    • 2016-09-23
    • 2012-05-11
    • 1970-01-01
    • 2019-03-30
    • 1970-01-01
    相关资源
    最近更新 更多