我已經偶然發現了一些非常奇怪的行爲與MongoDB。對於我的測試用例,我有一個包含9個文檔的MongoDB集合。所有文件具有完全相同的結構,包括字段expired_at: Date
和location: [lng, lat]
。
我現在需要找到所有尚未過期的文檔,並且位於邊框內;我在地圖上顯示匹配文件。爲了這個,我設置了以下疑問:
var qExpiry = {"expired_at": { $gt : new Date() } };
var qLocation = { "location" : { $geoWithin : { $box : [ [ 123.8766, 8.3269 ] , [ 122.8122, 8.24974 ] ] } } };
var qFull = { $and: [ qExpiry, qLocation ] };
由於到期日是在過去的很長,當我設置邊框足夠大,下面的查詢給我所有9個文檔作爲預期:
db.docs.find(qExpiry);
db.docs.find(qLocation);
db.docs.find(qFull);
db.docs.find(qExpiry).sort({"created_at" : -1});
db.docs.find(qLocation).sort({"created_at" : -1});
現在,這裏的交易:以下查詢返回0文件:
db.docs.find(qFull).sort({"created_at" : -1});
只是增加排序到與查詢遺址的結果(請注意,我要排序,因爲我也有一個利以避免在較大尺度上混亂地圖)。按其他字段排序會產生相同的空白結果。這裏發生了什麼?
(其實更奇怪:。當我放大到我的地圖,我有時會結果qFull
,即使排序有人可能會說qLocation
發生故障,但如果我只用qLocation
,結果總是正確的,qExpiry
對於所有文檔總是如此)
您是否嘗試過使用聚合框架的'$ match'和'$ sort'管道運行相同的查詢? – chridam
@chridam - 哇,這個伎倆!我會提供一個答案,因爲這似乎也是其他人可能遇到的問題。任何想法爲什麼這種方式工作,我的最初方法不是? – Christian