Un index unique sur un champ de tableau impose que la même valeur ne puisse pas apparaître dans les tableaux de plus d'un document dans la collection, mais n'empêche pas la même valeur d'apparaître plus d'une fois dans le tableau d'un même document. Vous devez donc garantir l'unicité lorsque vous ajoutez des éléments au tableau à la place.
Utilisez le $addToSet
opérateur pour ajouter une valeur à un tableau uniquement si la valeur n'est pas déjà présente.
Group.updateOne({name: 'admin'}, {$addToSet: {users: userOid}}, ...
Cependant, si les users
array contient des objets avec plusieurs propriétés et vous souhaitez garantir l'unicité sur une seule d'entre elles (uid
dans ce cas), alors vous devez adopter une autre approche :
var user = { uid: userOid, ... };
Group.updateOne(
{name: 'admin', 'users.uid': {$ne: user.uid}},
{$push: {users: user}},
function(err, numAffected) { ... });
Cela qualifie le $push
la mise à jour n'a lieu que si user.uid
n'existe pas déjà dans le uid
champ de l'un des éléments de users
. Il imite donc $addToSet
comportement, mais uniquement pour uid
.