Mongodb找到了返回文件的顺序

时间:2014-08-02 02:14:06

标签: mongodb

我有一个名为" date"的字段的集合。 (还有索引)。它包含值yyyymmdd(例如:20140731,20140730,20140729 ...)

文档根据日期以降序存储。因此该集合将20140731作为第一个文档。

当我使用带有过滤器{$ gte:20140720,$ lte:20140731}的find命令时,mongodb按照" date"的升序返回查询。领域。

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

谢谢!

1 个答案:

答案 0 :(得分:8)

文档按自然顺序存储

  

文档根据日期以降序存储。因此该集合将20140731作为第一个文档。

除非您使用capped collection,否则无法保证磁盘上的文档排序(也称为natural order)。

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

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

// 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()

结果顺序

  

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

如果索引用于查询,则按索引中找到的顺序返回文档。在构建常见查询的索引时,您应该利用这一点(请参阅:Use Indexes to Sort Query Results)。

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

按ObjectID排序

如果您使用MongoDB的default ObjectIDs _id,则可以按{ _id: 1 }排序以近似插入顺序,因为ObjectID的前4个字节包含时间戳。如果您想使用它来根据date和近似广告订单排序查询,则可以确保{date:1, _id:1}上的索引。

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