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 .