Подтвердить что ты не робот

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

Для моего проекта, я хочу сохранить документ 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: 'Пользователь', index: {unique: true, dropDups: true}} Но это все еще не работает.

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

4b9b3361

Ответ 1

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

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