Un indice univoco su un campo array impone che lo stesso valore non possa apparire negli array di più di un documento nella raccolta, ma non impedisce che lo stesso valore venga visualizzato più di una volta nell'array di un singolo documento. Quindi è necessario garantire l'unicità mentre si aggiungono elementi all'array.
Usa il $addToSet
per aggiungere un valore a un array solo se il valore non è già presente.
Group.updateOne({name: 'admin'}, {$addToSet: {users: userOid}}, ...
Tuttavia, se gli users
array contiene oggetti con più proprietà e si desidera garantire l'unicità solo su uno di essi (uid
in questo caso), allora devi adottare un altro approccio:
var user = { uid: userOid, ... };
Group.updateOne(
{name: 'admin', 'users.uid': {$ne: user.uid}},
{$push: {users: user}},
function(err, numAffected) { ... });
Ciò che fa è qualificare il $push
aggiornamento in modo che si verifichi solo se user.uid
non esiste già nel uid
campo di uno qualsiasi degli elementi di users
. Quindi imita $addToSet
comportamento, ma solo per uid
.