MongoDB - 调查集合中间的插入

时间:2016-03-23 19:26:48

标签: mongodb

我是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个代码。我的问题是,文件是在那个时间插入集合中间的原因是什么,而不是像所有其他尝试一样插入到最后?

感谢您的所有评论。

1 个答案:

答案 0 :(得分:1)

简而言之,可能会出现“差距”。在你的磁盘上的集合布局中(我们通常谈论的不是'上限'集合,这几乎总是如此)。

通常由于以下两个原因之一而发生:

  1. 从集合中间删除文档。
  2. 文档以这种方式更新,它不再适合其分配的空间。 MongoDB为此文档分配一个新位置并移动它。
  3. 当您进行插入操作时,MongoDB可能会尝试将您的新文档放入其中一个空白并成功使用它。

    如果要维护任何类型的排序,请在光标上使用sort()操作。并且不要忘记首先创建一个相应的索引。