2016-03-23 9 views
1

私はMongoDBを初めて使用しています。現在、私は現在何が異常であるかを調べています。だから、 'allcodes' コレクションに5つの新しいコードを挿入するMongoDB - コレクションの途中で挿入物を調べる

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 }); 
    } 
} 

はMongoDBの2.6.1で実行される以下のスクリプトを考えてみましょう。今では、スクリプト実行前にコレクションに約1000の他のコード(ドキュメント)がありました。環境の1つ(MongoDBのコピー)では、上記のスクリプトはコードの1つを挿入し、コレクションの途中では「abc1001」と言い、最後には他のすべてのコードを期待通りに挿入します。これを説明するために、ここに挿入した後、コレクションからすべての文書を引いた結果の抜粋です:

. 
. 
. 
abc500 
abc501 
abc1001 
abc502 
abc503 
. 
. 
. 
abc1002 
abc1003 
abc1004 
abc1005 

だから、一つのコードが末尾にコレクションの真ん中、そして他人に挿入してしまいました。今度は、このスクリプトを再実行すると、コレクションの最後に5つのコードがすべて挿入されるため、この問題を再現することはできません。私の質問は、文書がコレクションの途中に挿入された理由は何か、それは他のすべての試みのように、終わりに向かってではないのですか?

コメントをいただきありがとうございます。

+0

どのような問題がありますか?ドキュメントの注文は、[.sort()](https://docs.mongodb.org/manual/reference/method/cursor.sort/) –

+1

を使用した場合にのみ保証されます。何が間違っているのかを説明します:[ソート順が指定されていないときにMongoDBがレコードをソートする方法は?](http://stackoverflow.com/questions/11599069/how-does-mongodb-sort-records-when-no-sort -order-is-specified) – Bonanza

答えて

1

簡潔に言えば、ディスク上のコレクションレイアウトに「ギャップ」が表示されることがあります(通常、「キャップされた」コレクションではありませんが、ほとんどの場合そうです)。

これは通常起因する2つの理由の一つに起こる:

  1. 文書がコレクションの途中から削除されます。
  2. ドキュメントは、割り当てられた領域にはそれ以上適合しないように更新されます。 MongoDBはこの文書の新しい場所を割り当てて移動します。

MongoDBは、挿入操作を実行すると、MongoDBが新しい文書をこれらのギャップの1つに入れて成功させる可能性があります。

ご注文の種類を変更しない場合は、カーソルでsort()操作を使用してください。そして、最初にコレスポンデントインデックスを作成することを忘れないでください。

関連する問題