Et unikt indeks på et arrayfelt tvinger, at den samme værdi ikke kan vises i arrays af mere end ét dokument i samlingen, men forhindrer ikke, at den samme værdi vises mere end én gang i et enkelt dokuments array. Så du skal sikre unikhed, når du tilføjer elementer til arrayet i stedet for.
Brug $addToSet
operator for kun at tilføje en værdi til et array, hvis værdien ikke allerede er til stede.
Group.updateOne({name: 'admin'}, {$addToSet: {users: userOid}}, ...
Men hvis users
array indeholder objekter med flere egenskaber, og du ønsker at sikre unikhed over kun én af dem (uid
i dette tilfælde), så skal du tage en anden tilgang:
var user = { uid: userOid, ... };
Group.updateOne(
{name: 'admin', 'users.uid': {$ne: user.uid}},
{$push: {users: user}},
function(err, numAffected) { ... });
Det, der gør, er at kvalificere $push
opdatering til kun at ske, hvis user.uid
eksisterer ikke allerede i uid
felt af ethvert af elementerne i users
. Så det efterligner $addToSet
adfærd, men kun for uid
.