У меня есть коллекция с примерно 500 миллионами документов, где, по-видимому, ограничение уникальности не соблюдалось по определенному подмножеству. Признак единственности применяется к составному индексу.MongoDB, по-видимому, не соблюдает критерий единственности на составном индексе
Индексы на этой коллекции:
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 }
Я убил пакетную вставку этого подмножества документов, после чего повторно вставил их позже, но я удивлен, что это как-то позволяет дублировать. Я схожу с ума или это возможно при определенных условиях?
Вы можете создать тестовое подмножество? И дубликаты в вашей коллекции? Я вижу агрегацию с оператором группы, и я ожидаю, что вам придется расслабиться. Разве это не удается создать дубликаты записей ... – HoefMeistert
Нет разрыва (что я знаю). На самом деле я понял, что группировка является redudant в этом примере, просто показывая, что есть ЛЮБЫЕ дубликаты. Небольшие собственные дубликаты среди сгруппированных идентификаторов дубликата - пример redudant. Я попытаюсь воссоздать этот сценарий на тестовом подмножестве, но я боюсь, что это произошло из-за некоторого неопределенного состояния, вызванного отменой операции объемной вставки ... –
Может быть, MongoDB требует, чтобы вставка/запрос совпадали с порядок полей полей? Это, к сожалению, меньше всего! –