我有一个名为" date"的字段的集合。 (还有索引)。它包含值yyyymmdd(例如:20140731,20140730,20140729 ...)
文档根据日期以降序存储。因此该集合将20140731作为第一个文档。
当我使用带有过滤器{$ gte:20140720,$ lte:20140731}的find命令时,mongodb按照" date"的升序返回查询。领域。
我知道我可以使用sort,但是如何让mongodb根据创建的顺序返回结果?
谢谢!
答案 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}
)可用于返回按升序或降序排序的结果。
如果您使用MongoDB的default ObjectIDs _id
,则可以按{ _id: 1 }
排序以近似插入顺序,因为ObjectID的前4个字节包含时间戳。如果您想使用它来根据date
和近似广告订单排序查询,则可以确保{date:1, _id:1}
上的索引。
请注意,ObjectID通常由客户端驱动程序生成,因此如果您的应用服务器上有时钟漂移(或者在插入文档之前的某个时间创建了_id
),ObjectID可能不会严格反映“插入”命令“由服务器看到。如果插入顺序的准确性非常重要,通常可以在服务器端生成_id
(方法因驱动程序而异)。