2013-08-01 70 views
0

我在使用MongoDB的.sort()時遇到問題,因爲它刪除沒有排序字段的文檔。MongoDB sort()刪除不包含排序過濾器的文檔

例如,我有文件一些含有「timeSent」字段和一些不是數組:

db.foo.find() = 
    { 
     "_id": { "$oid" : "51f25e497363055d1fde7524" }, 
     "eventID": 159, 
     "timeSent": 1374844250464 
    } 
    { 
     "_id": { "$oid" : "51f25e497363055d1fde7525" }, 
     "eventID": 158, 
     "timeSent": 1374844250465 
    } 
    { 
     "_id": { "$oid" : "51f25e497363055d1fde7526" }, 
     "eventID": 157 
    } 

使用的.sort()刪除其中「timeSent」不存在的文件。

db.foo.find()排序({ 「timeSent」:1})。。跳過(0).limit(30)

我想知道是否有在蒙戈的方式排序並返回像SQL這樣的完整文檔。 (排序「timeSent現有的」頂部場和「timeSent不存在」的底部,或者反之亦然根據ASC或DESC)

感謝

附:一直試圖使用MongoCursor在PHP中實現這一點。

+0

您是否嘗試過從mongo的控制檯中查找並排序?我做了一個快速測試,並在結果中顯示缺少字段的文檔。 –

+1

我會檢查我的mongoDB版本是否是最新的,以及我是否使用最新的驅動程序。即使排序鍵不存在,Mongo排序命令也會返回文檔。 – Munim

+0

謝謝,我檢查過這個版本是MongoDB的最新版本。 - 我發現問題發生在我確保索引時。如果您使用下面的命令嘗試它,它將刪除鍵不存在的位置。 db.foo.ensureIndex({'timeSent':1},{'unique':true,'sparse':true,'dropDups':true})有什麼想法? – Jason

回答

2

Mongo可能在您之前定義的過濾字段上使用了sparse索引:在光標上使用explain以確保。

你既可以告訴Mongo not to use that index,也可以重建索引,包括沒有密鑰的字段(即你的create a non sparse index)。

(對不起,前面的回答,我知道它倒退了......)