2013-08-01 38 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)。

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