Mongoose Уникальные значения во вложенном массиве объектов

Для моего проекта я хочу сохранить документ мангуста для групп организаций, например:

var groupSchema = Schema({ name : { type : String }, org : { type : Schema.Types.ObjectId, ref : 'Organization' }, ... users : [{ uid : { type : Schema.Types.ObjectId, ref : 'User' }, ... }] }); 

Я хочу, чтобы один и тот же пользователь не был в одной группе дважды. Для этого мне нужно заставить users.uid быть уникальным в массиве users. Я попытался указать «unique: true» для uid, но это не сработало. Есть ли способ сделать это с помощью mongoose или mongoDB без дополнительных запросов или разделения схемы?

Изменить: я изменил предыдущее значение uid на uid: {type: Schema.Types.ObjectId, ref: ‘User’, index: {unique: true, dropDups: true}} Но это все еще не работает.

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

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

Используйте оператор $addToSet чтобы добавить значение к массиву только в том случае, если это значение уже отсутствует.

 Group.update({name: 'admin'}, {$addToSet: {users: userOid}}, ... 

Однако, если массив users содержит объекты с несколькими свойствами, и вы хотите обеспечить уникальность только одного из них (в этом случае uid ), вам нужно воспользоваться другим подходом:

 var user = { uid: userOid, ... }; Group.update( {name: 'admin', 'users.uid': {$ne: user.uid}}, {$push: {users: user}}, function(err, numAffected) { ... }); 

Это означает, что обновление $push обновляется только в том случае, если user.uid еще не существует в поле uid любого из элементов users . Поэтому он имитирует поведение $addToSet , но для просто uid .

  • NPM не может устанавливать зависимости. Попытайтесь разблокировать что-то, что не было заблокировано.
  • Как разрешить CORS?
  • Автономное приложение Node.js
  • Как развернуть узловое приложение, которое использует grunt для heroku
  • После установки Gulp: «no command» gulp «found»
  • Browserify - вызов функции, связанной с файлом, созданным с помощью браузера в браузере
  • Как использовать глобальную переменную в node.js?
  • Что означает ошибка ELIFECYCLE Node.js?
  • Вложенный запрос Mongoose в Model по полю его ссылочной модели
  • Mongoose удалить элемент массива в документе и сохранить
  • ошибка получения: «Ошибка: ошибка SSL: SELF_SIGNED_CERT_IN_CHAIN» при использовании npm
  • Interesting Posts

    Несколько примечаний с пружиной @RequestMapping

    Считайте уникальные значения с помощью pandas на группы

    Существуют ли какие-либо инструменты для анализа статического кода для Delphi / Pascal?

    Многострочные команды bash в make-файле

    Как избежать специальных символов, например, в sqlite в android

    Laravel: Как разобрать данные json в лесу?

    Как изменить виджет по умолчанию для всех полей даты Django в ModelForm?

    Почему сценарий моих приложений, развернутый как исполняемый API API, возвращает разрешение «Отказано»?

    Matlab: запуск m-файла из командной строки

    sed заменить переменной на несколько строк

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

    Как вы сопоставляете только действительные римские цифры с регулярным выражением?

    Как создать электронное письмо со встроенными изображениями, совместимое с большинством почтовых клиентов

    Как я могу распараллелить цикл for через C ++ std :: list с помощью OpenMP?

    Запуск процесса мониторинга в системе

    Давайте будем гением компьютера.