Mongodb在插入时重新排序对象

时间:2014-01-31 14:25:47

标签: javascript node.js mongodb express

在我的节点js app中使用Mongo DB,在数据库中插入内容时遇到问题。当我将新记录添加到集合对象时重新排序。有谁知道为什么会这样?我正在做这样的插入

collection.insert(object, {safe:true}, function(err, result) {
    if (err) {
        res.send({'error':'An error has occurred'});
    } else {
        // Error
    }
});

实际上,对集合的任何操作都会改变对象的顺序,有谁知道为什么会发生这种情况?

1 个答案:

答案 0 :(得分:0)

MongoDB文档具有用于更新的填充空间。如果对文档进行小的更改(如添加/更新小字段),则更新文档的大小很可能会增加,但仍然适合分配的空间,因为它可以使用该填充。如果更新的文档不适合该空间,Mongo会将其移动到磁盘上的新位置。因此,您的文档可能会在开始时移动很多,直到Mongo了解您通常需要多少填充来阻止此类移动。您还可以设置更高的填充以避免文档首先被移动。

在任何一种情况下,您都无法真正依赖插入顺序来获取文档的排序列表。如果您想要保证订单,您需要排序。在您的情况下,您可以按_id排序,因为它是一个单调增加的计数器,其中包含日期和时间详细信息:

// in the order of insertion unless you got `_id` value externally
// (in your code, not auto assigned by Mongo) and doc with such ID
// was inserted much later.
// Sharding might also introduce tiny ordering mismatches
db.collection.find().sort( { '_id': 1 } );

// most recently inserted items first
db.collection.find().sort( { '_id': -1 } );

如果使用上限集合,插入顺序将始终保留,即Mongo永远不会移动文档。在这种情况下,您可以使用自然顺序排序:

db.collection.find().sort( { $natural: 1 } )

相当于按_id排序,如上所示。

不要对非上限集合(常规集合)使用自然顺序排序,因为在更新时它不可靠。