Ответ 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
.