Вопрос связан с индексом
unique compound
, в отличие от других подобных вопросов, которые имеют только индексunique
. У меня также есть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') }"
}
})
Я не понимаю причины. Индексы sparse
и compound
. Но ошибка как раз из-за наличия того же поля 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
answerId_1_votedBy_1 dup key: { : null,
указывает на то, что вашanswerId
не был указан в каждом отдельном документе и, следовательно, имеетnull
, который вы просили сделать уникальным. Даже в составном вы можете иметь только один. То, что вы делаете точно так же, как и все остальные вопросы, — это добавление фильтра разреженного или частичного индекса в современных версиях для обслуживания документов, в которые вы не добавили это значение, которое является частью составного индекса. - person Neil Lunn   schedule 06.11.2017sparse
. Но все же я получаю эту ошибку. Вы можете увидеть список индексов.sparse: true
присутствует. - person abhisekp   schedule 06.11.2017votedBy
с двумя другими ключами, которые могут составить соединение. По сути, это означает, что один пользователь получает 1 голос за ответ, 1 голос за вопрос и 1 голос, который на самом деле не назначен ни одному из них. Это то, что вы применяете здесь и, похоже, не понимаете этого. Вместо этого вам нужно"_id", "type", "voted_by"
, где есть один уникальный индекс, и вы различаете значение типа, а не имя поляanswerId/questionId
. Это фиксированное наименование и чередование и является причиной проблемы. - person Neil Lunn   schedule 06.11.2017_id
какquestionId
илиanswerId
, так как могут быть одинаковыеquestionId
с разнымиvotedBy
. Что мне делать и как структурировать? - person abhisekp   schedule 06.11.2017_id
. Просто используйте одно поле для этого значения, а не два. - person Neil Lunn   schedule 06.11.2017