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