[英]geo-spatial query with sort and limit on a secondary field
我正在嘗試獲取附近地區最近創建的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在執行排序操作之前先執行限制操作。 是否有任何方法可以在應用限制之前強制其排序?
geo-spatial
查詢已將文檔從最近到最遠進行 排序 。 因此,如果您還有其他sort()和limit(),則將首先應用limit(),因為結果已經按距離進行了排序。
盡管我認為在地理空間查詢中對“ created_at”進行排序沒有多大意義,但是如果您仍然需要它,則只能通過編程來完成。 也就是說,對查詢中的整個結果進行排序,然后將限制應用到客戶端程序中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.