我是MongoDB的新手,我正在调查目前看起来像是异常的东西。
考虑在MongoDB 2.6.1上执行的以下脚本:
var codes = [
"abc1001",
"abc1002",
"abc1003",
"abc1004",
"abc1005"];
var codesCount = codes.length;
for (var i = 0; codesCount > i; i++) {
var insertCode = codes[i];
var result = db.allcodes.findOne({ code: insertCode });
if (result == null) {
db.allcodes.insert({ code: insertCode });
}
}
所以在'allcodes'集合中插入5个新代码。现在,在脚本执行之前,集合中还有大约1000个其他代码(文档)。在其中一个环境(MongoDB的副本)中,上面的脚本插入了一个代码,在集合的中间说'abc1001',所有其他代码在结尾处插入,如预期的那样。为了说明这一点,下面是插入后从集合中提取所有文档的结果片段:
.
.
.
abc500
abc501
abc1001
abc502
abc503
.
.
.
abc1002
abc1003
abc1004
abc1005
因此,一个代码插入到集合的中间,其他代码插入到最后。现在我还没有能够重现这个问题,因为重新执行这个脚本总是在集合的末尾插入所有5个代码。我的问题是,文件是在那个时间插入集合中间的原因是什么,而不是像所有其他尝试一样插入到最后?
感谢您的所有评论。
答案 0 :(得分:1)
简而言之,可能会出现“差距”。在你的磁盘上的集合布局中(我们通常谈论的不是'上限'集合,这几乎总是如此)。
通常由于以下两个原因之一而发生:
当您进行插入操作时,MongoDB可能会尝试将您的新文档放入其中一个空白并成功使用它。
如果要维护任何类型的排序,请在光标上使用sort()
操作。并且不要忘记首先创建一个相应的索引。