Mongodb find';s退回文件订单

Mongodb find';s退回文件订单,mongodb,Mongodb,我有一个集合,其中有一个名为“date”的字段(也被索引)。它保存值yyyymmdd(例如:20140731、20140730、20140729…) 文档按日期降序存储。因此,该集合将20140731作为第一个文档 当我对过滤器{$gte:20140720,$lte:20140731}使用find命令时,mongodb会按“日期”字段的升序返回查询 我知道我可以使用sort,但是如何让mongodb根据创建顺序返回结果呢 谢谢 文档按自然顺序存储 文档按日期降序存储。因此,该集合将2014073

我有一个集合,其中有一个名为“date”的字段(也被索引)。它保存值yyyymmdd(例如:20140731、20140730、20140729…)

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

当我对过滤器{$gte:20140720,$lte:20140731}使用find命令时,mongodb会按“日期”字段的升序返回查询

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

谢谢

文档按自然顺序存储 文档按日期降序存储。因此,该集合将20140731作为第一个文档

除非您使用的是,否则无法保证对磁盘上的文档(也称为)进行排序

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

下面是一个在
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()
//从空数据库和集合开始
使用解调器;db.dropDatabase();db.order.drop()
//添加一些测试数据

对于(i=0;iUse:
.sort({$natural:1})
?@alexce natural排序反映磁盘上的顺序,而不是插入顺序(尤其是随着时间的推移)除非您要插入到一个有上限的集合中。另请参见:。批量插入的文档的顺序是如何维护的?就像我一次插入5条记录并具有相同的顺序一样timestamp@AkshayNaik大容量插入的磁盘上文档的顺序与单个插入的处理方式没有区别。大容量写入操作可以按顺序处理,但这只能决定不知道这些操作是串行执行还是并行执行。存储引擎管理磁盘上文档的顺序,对于默认WiredTiger存储引擎以及较旧的(现在已弃用)存储引擎,该顺序尚未定义MMAPv1存储引擎。在我的例子中,两天前我在一次收集中有超过数百万个文档,我重新启动了服务器,所有收集中的文档顺序都被重新调整,之前是按插入顺序,现在是随机顺序。我正在寻找在什么情况下发生这种情况的原因。@AkshayNaik和WiredTiger代表内存中文档的语句与磁盘上的格式不同。如果希望结果的顺序可预测,则需要在唯一字段上指定排序顺序。添加排序({u id':1})给我的原始顺序是正确的。