Um índice exclusivo em um campo de matriz garante que o mesmo valor não possa aparecer nas matrizes de mais de um documento na coleção, mas não impede que o mesmo valor apareça mais de uma vez na matriz de um único documento. Portanto, você precisa garantir a exclusividade ao adicionar elementos à matriz.
Use o
$addToSet
operador para adicionar um valor a uma matriz somente se o valor ainda não estiver presente. Group.updateOne({name: 'admin'}, {$addToSet: {users: userOid}}, ...
No entanto, se os
users
array contém objetos com várias propriedades e você deseja garantir exclusividade sobre apenas um deles (uid
neste caso), então você precisa tomar outra abordagem:var user = { uid: userOid, ... };
Group.updateOne(
{name: 'admin', 'users.uid': {$ne: user.uid}},
{$push: {users: user}},
function(err, numAffected) { ... });
O que isso faz é qualificar o
$push
atualização ocorra apenas se user.uid
ainda não existe no uid
campo de qualquer um dos elementos de users
. Então, ele imita $addToSet
comportamento, mas apenas para uid
.