Mongodb找到了返回的文档顺序

hel*_*tyj 1 mongodb

我有一个名为"date"的字段的集合(也是索引的).它保存值yyyymmdd(例如:20140731,20140730,20140729 ......)

文档根据日期以降序存储.所以该系列有20140731作为第一个文件.

当我使用带有过滤器{$ gte:20140720,$ lte:20140731}的find命令时,mongodb以"date"字段的升序返回查询.

我知道我可以使用sort,但是如何让mongodb根据它的创建顺序返回结果?

谢谢!

Ste*_*nie 8

文档按自然顺序存储

文档根据日期以降序存储.所以该系列有20140731作为第一个文件.

除非您使用上限集合,否则无法保证磁盘上的文档排序(也称为自然顺序).

文档删除和移动(当文档超出其分配的记录空间时)在空闲列表上创建将被重用的空间.

这是一个快速示例,应该在mongoshell中演示:

// Start with an empty database & collection
use demodb; db.dropDatabase(); db.order.drop()

// Add some test data
for (i=0; i<1000; i++) {
    db.order.insert({'i': i})
}

// Looks like insertion order! (0..9)
db.order.find({}).limit(10);

// Pause 5s for effect :)
sleep(5000);

// Remove half the entries
db.order.remove({ i: { $lt: 500 }})

// Re-add the missing entries
for (i=0; i<500; i++) {
    db.order.insert({'i': i})
}

// Not the entries you expected .. space from deleted records was reused
db.order.find({}).limit(10)

// Clean up demodb
db.dropDatabase()
Run Code Online (Sandbox Code Playgroud)

结果顺序

当我使用带有过滤器{$ gte:20140720,$ lte:20140731}的find命令时,mongodb以"date"字段的升序返回查询.

如果索引用于查询,则按索引中找到的顺序返回文档.在为常见查询构建索引时应该利用这一点(请参阅:使用索引对查询结果进行排序).

仅供参考,简单索引(例如,开启{date:1})可用于返回按升序或降序排序的结果.

按ObjectID排序

如果您正在使用MongoDB的默认的ObjectID_id,你可以按{ _id: 1 }到近似的插入顺序,因为前4个字节的对象ID的结合时间戳.如果您想使用它来根据date和近似的插入顺序对查询进行排序,那么您将确保索引{date:1, _id:1}.

请注意,ObjectID通常由客户端驱动程序生成,因此如果您的应用程序服务器上有时钟漂移(或者在_id插入文档之前的某个时间创建),则ObjectID可能不会严格反映服务器看到的"插入顺序".如果插入顺序的准确性非常重要,通常可以_id在服务器端生成(方法因驱动程序而异).