MongoDB уникальный индекс для всех элементов массива - PullRequest
0 голосов
/ 01 февраля 2019

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

Сначала я создаю простой документ:

{
    "name" : "Just a name",
    "users" : [ 
        "user1", 
        "user2"
    ]
}

И я хочу создать уникальный индекс для поля массива 'users'.В результате я хочу создать такие документы, как этот:

{
    "name" : "Just a name",
    "users" : [ 
        "user1", 
        "user3"
    ]
}

или

{
    "name" : "Just a name",
    "users" : [ 
        "user2", 
        "user5"
    ]
}

НО создать второй элемент невозможно:

{
    "name" : "Just a name",
    "users" : [ 
        "user1", 
        "user2"
    ]
}

Или в обратном порядке:

{
    "name" : "Just a name",
    "users" : [ 
        "user2", 
        "user1"
    ]
}

Но это невозможно, потому что Монго выдает ошибку, что «users1» дублируется.Можно ли создать уникальный индекс для всех элементов массива, как показано выше?

Ответы [ 2 ]

0 голосов
/ 18 апреля 2019

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

Для индексации поля, содержащего значение массива, MongoDB создает ключ индекса для каждого элемента в массиве

т.е. каждый из отдельных элементов массива должен быть уникальным для всех других документов.

0 голосов
/ 04 февраля 2019

Согласно официальной документации Монго

Для уникальных индексов ограничение уникальности применяется к отдельным документам в коллекции, а не к одному документу .

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

Таким образом, вы не можете вставить вторые документы как

{
"name" : "Just a name",
"users" : [ 
    "user1", 
    "user3"
]
}

Вы получите ошибку дублирования уникального ограничения:

> db.st1.insert({"name":"Just a name","users":["user1","user3"]})
WriteResult({
   "nInserted" : 0,
   "writeError" : {
      "code" : 11000,
      "errmsg" : "E11000 duplicate key error collection: test.st1 index: users_1 dup key: { : \"user1\" }"
   }
})

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...