Ett unikt index på ett arrayfält tvingar fram att samma värde inte kan visas i arrayerna för mer än ett dokument i samlingen, men förhindrar inte att samma värde visas mer än en gång i ett enda dokuments array. Så du måste säkerställa unikhet när du lägger till element till arrayen istället.
Använd $addToSet
operatorn för att lägga till ett värde till en array endast om värdet inte redan finns.
Group.updateOne({name: 'admin'}, {$addToSet: {users: userOid}}, ...
Men om users
array innehåller objekt med flera egenskaper och du vill säkerställa unikhet över bara en av dem (uid
i det här fallet), måste du ta ett annat tillvägagångssätt:
var user = { uid: userOid, ... };
Group.updateOne(
{name: 'admin', 'users.uid': {$ne: user.uid}},
{$push: {users: user}},
function(err, numAffected) { ... });
Vad det gör är att kvalificera $push
uppdatering sker endast om user.uid
finns inte redan i uid
fältet för något av elementen i users
. Så det härmar $addToSet
beteende, men bara för uid
.