はい。ドキュメントが埋め込まれた配列フィールドで一意のインデックスを使用する方法については、次の2つのシナリオをご覧ください。
一意のマルチキーインデックス (配列内に埋め込まれたドキュメントフィールドのインデックス):
最初のシナリオ:
db.arrays.createIndex( { _id: 1, "array.id": 1}, { unique: true } )
db.arrays.insertOne( { "_id": 1, "array": [ { "id": 1, "content": "11"}, { "id": 2, "content": "22"} ] } )
db.arrays.insertOne( { "_id": 2, "array": [ { "id": 1, "content": "1100"}, { "id": 5, "content": "55"} ] } )
db.arrays.insertOne( {"_id": 3, "array": [ {"id": 3, "content": "33"}, {"id": 3, "content": "3300"} ] } )
3つのドキュメントすべてがエラーなしで挿入されます。
一意のマルチキーインデックスに関する注記に従って 、上記の_id : 3
のドキュメント 同じ"array.id"
を持つ2つの埋め込みドキュメントが配列内にあります 値:3
。
また、一意性は、複合インデックス{ _id: 1, "array.id": 1}
の2つのキーに適用されます。 重複した"array.id"
がありました ドキュメント全体の値も(_id
値1
および2
。
2番目のシナリオ:
db.arrays2.createIndex( { "array.id": 1 }, { unique: true } )
db.arrays2.insertOne( { "_id": 3, "array": [ { "id": 3, "content": "33" }, { "id": 3, "content": "330"} ] } )
db.arrays2.insertOne( { "_id": 4, "array": [ { "id": 3, "content": "331" }, { "id": 30, "content": "3300" } ] } )
_id : 3
の最初のドキュメント 正常に挿入されます。 2番目のエラー:"errmsg" : "E11000 duplicate key error collection: test.arrays2 index: array.id_1 dup key: { array.id: 3.0 } "
。この動作は、一意のマルチキーインデックスの注記に従って予想どおりです。 。