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: Предполагая, что для этого нет простого способа, я добавил дополнительную проверку запроса, если пользователь уже находится в группе. Это кажется мне самым простым способом.

One Solution collect form web for “Mongoose Уникальные значения во вложенном массиве объектов”

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

Используйте оператор $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 .

  • В какой области переменные модуля хранятся в node.js?
  • Каков пример простейшего возможного примера Socket.io?
  • Как разобрать HTML-страницу с помощью Node.js
  • Что делает тело-парсер с выражением?
  • Каков параметр «следующий», используемый в Express?
  • Как выйти из Node.js
  • Sails.js заполняют вложенные ассоциации
  • Как получить полный URL в Express?
  • Как установить модуль глобально с помощью npm?
  • Как разместить несколько узлов Node.js на одном и том же IP-сервере с разными доменами?
  • Загрузите модуль node.js из строки в памяти
  • Давайте будем гением компьютера.