2016-11-01 7 views
0

У меня есть коллекция с примерно 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 } 

Я убил пакетную вставку этого подмножества документов, после чего повторно вставил их позже, но я удивлен, что это как-то позволяет дублировать. Я схожу с ума или это возможно при определенных условиях?

+0

Вы можете создать тестовое подмножество? И дубликаты в вашей коллекции? Я вижу агрегацию с оператором группы, и я ожидаю, что вам придется расслабиться. Разве это не удается создать дубликаты записей ... – HoefMeistert

+0

Нет разрыва (что я знаю). На самом деле я понял, что группировка является redudant в этом примере, просто показывая, что есть ЛЮБЫЕ дубликаты. Небольшие собственные дубликаты среди сгруппированных идентификаторов дубликата - пример redudant. Я попытаюсь воссоздать этот сценарий на тестовом подмножестве, но я боюсь, что это произошло из-за некоторого неопределенного состояния, вызванного отменой операции объемной вставки ... –

+0

Может быть, MongoDB требует, чтобы вставка/запрос совпадали с порядок полей полей? Это, к сожалению, меньше всего! –

ответ

0

_id уникален для коллекции в mongodb.

Повторяющиеся идентификаторы могут возникать, если мы находимся в оштукатуренной среде.

Чтобы избежать дубликатов, используйте параметр {unique: true}, чтобы гарантировать, что базовый индекс обеспечивает уникальность, пока уникальный индекс является префиксом ключа осколка.

Если опция «unique: true» не используется, ключ осколка не обязательно должен быть уникальным.

Ссылка:

https://docs.mongodb.com/manual/sharding/

Duplicate documents on _id (in mongo)

Читать эту post для получения больше информации о дубликате _id через различные коллекции

+0

Да, но я имел в виду значения повторяющихся составных полей, которые я нашел, несмотря на то, что эти поля образуют составной индекс с уникальным ограничением. Я не понимаю, как это возможно, но я не вижу, где я ошибся в своем анализе ситуации. –