1

約 5 億のドキュメントを含むコレクションがありますが、これらの特定のサブセットに一意性制約が適用されていないようです。一意性制約は、複合インデックスに適用されます。

このコレクションのインデックス:

db.elements.getIndexes()
[
        {
                "v" : 1,
                "key" : {
                        "_id" : 1
                },
                "name" : "_id_",
                "ns" : "test.elements"
        },
        {
                "v" : 1,
                "key" : {
                        "sessionId" : 1
                },
                "name" : "sessionId_1",
                "ns" : "test.elements"
        },
        {
                "v" : 1,
                "key" : {
                        "sessionId" : 1,
                        "modelFolder" : 1,
                        "modelName" : 1
                },
                "name" : "sessionId_1_modelFolder_1_modelName_1",
                "ns" : "test.elements",
                "options" : {
                        "unique" : true
                }
        },
        {
                "v" : 1,
                "key" : {
                        "id" : 1
                },
                "name" : "id_1",
                "ns" : "test.elements",
                "options" : {
                        "unique" : false
                }
        },
        {
                "v" : 1,
                "key" : {
                        "uniqueId" : 1
                },
                "name" : "uniqueId_1",
                "ns" : "test.elements"
        }
]

次のクエリを実行すると、クエリがインデックス 'sessionId_1_modelFolder_1_modelName_1' の複合インデックス フィールドで一致しているにもかかわらず、重複が発生します (IP の問題により、特定のフィールド値が編集されています)。

var gs = (
    db
    .elements
    .aggregate(
        [
          {
            $match : {
              "sessionId" : (specific sessionId value),
              "modelName" : (specific modelName value),
              "modelFolder" : (specific modelFolder value)
            }
          },
          {
            $group : {
              _id : "$id",
              total : { $sum : 1 }
            }
          }
        ]  
      )
  );

gs.forEach(
    function(g) { printjson(g); }
  );

出力のサブセット:

{ "_id" : 1394912, "total" : 2 }
{ "_id" : 1394916, "total" : 2 }
{ "_id" : 1394914, "total" : 2 }
{ "_id" : 1394909, "total" : 2 }
{ "_id" : 1394877, "total" : 2 }
{ "_id" : 1394908, "total" : 2 }
{ "_id" : 1394900, "total" : 2 }
{ "_id" : 1394906, "total" : 2 }
{ "_id" : 1394907, "total" : 2 }
{ "_id" : 1394876, "total" : 2 }
{ "_id" : 1394904, "total" : 2 }
{ "_id" : 1394902, "total" : 2 }
{ "_id" : 1394903, "total" : 2 }
{ "_id" : 1394881, "total" : 2 }
{ "_id" : 1394859, "total" : 2 }
{ "_id" : 1394901, "total" : 2 }
{ "_id" : 1394878, "total" : 2 }
{ "_id" : 1394880, "total" : 2 }
{ "_id" : 1394857, "total" : 2 }
{ "_id" : 1394875, "total" : 2 }

このドキュメントのサブセットのバッチ挿入を強制終了し、後でそれらを再一括挿入しましたが、これにより何らかの形で重複が可能になることに驚いています。私は夢中になっていますか、それとも特定の条件下で可能ですか?

4

1 に答える 1

0

_id は、mongodb のコレクションに対して一意です。

シャード環境にいる場合、ID の重複が発生する可能性があります。

重複を避けるには、{unique: true} オプションを使用して、一意のインデックスがシャード キーのプレフィックスである限り、基礎となるインデックスが一意性を強制するようにします。

"unique: true" オプションを使用しない場合、シャード キーは一意である必要はありません。

参考文献:

https://docs.mongodb.com/manual/sharding/

_id でドキュメントを複製する (mongo で)

異なるコレクション間で重複する _id の詳細については、この投稿をお読みください。

于 2016-11-01T09:27:02.550 に答える