簡體   English   中英

對次要字段進行排序和限制的地理空間查詢

[英]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在執行排序操作之前先執行限制操作。 是否有任何方法可以在應用限制之前強制其排序?

這里提出類似的問題,但查詢本身存在問題。 這個問題專門針對“ $ near”查詢嗎?

geo-spatial查詢已將文檔從最近到最遠進行 排序 因此,如果您還有其他sort()和limit(),則將首先應用limit(),因為結果已經按距離進行了排序。

盡管我認為在地理空間查詢中對“ created_at”進行排序沒有多大意義,但是如果您仍然需要它,則只能通過編程來完成。 也就是說,對查詢中的整個結果進行排序,然后將限制應用到客戶端程序中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM