Как обеспечить уникальный элемент в массиве на основе определенных полей - mongoDB? - программирование
Подтвердить что ты не робот

Как обеспечить уникальный элемент в массиве на основе определенных полей - mongoDB?

В моем scenerio есть авторы в коллекции, каждый автор имеет messages, и каждое сообщение автора может иметь events. Каждому актеру разрешалось выполнять только один вид действия один раз.

db.people.ensureIndex({messages.messageEvents.eventName: 1, messages.messageEvents.actorId: 1}, {unique: true});

Я добавил индекс, но он не имеет никакого эффекта. Как вы видите ниже, мой документ имеет три элемента, которые имеют "eventName":"vote" и "actorId":"1234", которые должны быть против моего ограничения.

Как обеспечить уникальный элемент в массиве messageEvents на основе полей eventName и actorId?

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

{
  "_id": "1234567",
  "authorPoint": 0,
  "messages": [
    {
      "messageId": "112",
      "messageType": "Q",
      "messagePoint": 0,
      "messageEvents": [
        {
          "eventName": "Add",
          "actorId": "1234",
          "detail": ""
        },
        {
          "eventName": "Vote",
          "actorId": "1234",
          "detail": "up"
        },
        {
          "eventName": "Vote",
          "actorId": "1234",
          "detail": "down"
        },
        {
          "eventName": "Vote",
          "actorId": "1234",
          "detail": "cork"
        }
      ]
    }
  ]
}
4b9b3361

Ответ 1

Мустафа, уникальные ограничения не применяются в пределах одного массива, хотя они применяются в документах в коллекции. Это известная ошибка, которая не будет исправлена ​​некоторое время:

https://jira.mongodb.org/browse/SERVER-1068

Там обходной путь. Держите свой уникальный индекс на месте и:

1) Убедитесь, что приложение не вставляет новые документы с повторяющимися значениями в массиве. Вы можете проверить уникальность кода приложения перед вставкой.

2) При обновлении существующих документов используйте $addToSet вместо $push.