web-dev-qa-db-ja.com

MongoError:一意の複合インデックスのE11000重複キーエラーコレクション

質問は、uniqueインデックスのみを持つ他のそのような質問とは異なり、_unique compound_インデックスに関連しています。インデックス用の_sparse: true_もあります。

コレクションに次のインデックスがあります

_[
  {
    "v": 2,
    "key": {
      "_id": 1
    },
    "name": "_id_",
    "ns": "somedb.votes"
  },
  {
    "v": 2,
    "key": {
      "answerId": 1
    },
    "name": "answerId_1",
    "ns": "somedb.votes",
    "sparse": true,
    "background": true
  },
  {
    "v": 2,
    "key": {
      "questionId": 1
    },
    "name": "questionId_1",
    "ns": "somedb.votes",
    "sparse": true,
    "background": true
  },
  {
    "v": 2,
    "unique": true,
    "key": {
      "answerId": 1,
      "votedBy": 1
    },
    "name": "answerId_1_votedBy_1",
    "ns": "somedb.votes",
    "sparse": true,
    "background": true
  },
  {
    "v": 2,
    "unique": true,
    "key": {
      "questionId": 1,
      "votedBy": 1
    },
    "name": "questionId_1_votedBy_1",
    "ns": "somedb.votes",
    "sparse": true,
    "background": true
  }
]
_

そして私はコレクションに次のドキュメントを持っています

_{
  "_id": ObjectId("59fdd3ce915511329553dfaa"),
  "updatedAt": ISODate("2017-11-04T14:54:22.110Z"),
  "votedAt": ISODate("2017-11-04T14:50:54.681Z"),
  "questionId": ObjectId("59fc77e45a857465a90339cc"),
  "value": -1,
  "votedBy": ObjectId("59fc4274aa686d39abe5d58a"),
  "type": "QuestionVote",
  "__v": 0
}
_

今、私が以下を実行しようとすると

db.votes.insert({ questionId: ObjectId("59fc798d5a857465a90339cf"), value: -1, votedBy: ObjectId("59fc4274aa686d39abe5d58a"), type: 'QuestionVote', _id: ObjectId("5a003240bfd8194a02d0add8") })

次のエラーが発生します

_E11000 duplicate key error collection: somedb.votes index: answerId_1_votedBy_1 dup key: { : null, : ObjectId('59fc4274aa686d39abe5d58a') }
WriteResult({
  "nInserted": 0,
  "writeError": {
    "code": 11000,
    "errmsg": "E11000 duplicate key error collection: somedb.votes index: answerId_1_votedBy_1 dup key: { : null, : ObjectId('59fc4274aa686d39abe5d58a') }"
  }
})
_

理由がわかりません。インデックスはsparsecompoundです。ただし、エラーは同じvotedByフィールドが存在するために発生します。

つまり、以下を実行します。

_db.votes.insert({votedBy: ObjectId("59fc4274aa686d39abe5d58a")})
_

votedByオブジェクトに明示的なインデックスがない場合でも、次のエラーが発生します。

_E11000 duplicate key error collection: somedb.votes index: answerId_1_votedBy_1 dup key: { : null, : ObjectId('59fc4274aa686d39abe5d58a') }
WriteResult({
  "nInserted": 0,
  "writeError": {
    "code": 11000,
    "errmsg": "E11000 duplicate key error collection: somedb.votes index: answerId_1_votedBy_1 dup key: { : null, : ObjectId('59fc4274aa686d39abe5d58a') }"
  }
})
_

参照:複合インデックス- https://docs.mongodb.com/manual/core/index-compound/#compound-indexes

3
abhisekp

このエラーの背後にある理由はそれです。レコードを挿入しようとしているコレクションにインデックスが存在しません。つまり、解決策は-そのコレクションを削除して、プログラムを再度実行することです。

0
user2049674