Unikalny indeks w polu tablicy wymusza, aby ta sama wartość nie mogła pojawić się w tablicach więcej niż jednego dokumentu w kolekcji, ale nie zapobiega pojawianiu się tej samej wartości więcej niż raz w tablicy pojedynczego dokumentu. Musisz więc zapewnić unikalność podczas dodawania elementów do tablicy.
Użyj $addToSet
operator, aby dodać wartość do tablicy tylko wtedy, gdy wartość nie jest jeszcze obecna.
Group.updateOne({name: 'admin'}, {$addToSet: {users: userOid}}, ...
Jeśli jednak users
tablica zawiera obiekty o wielu właściwościach i chcesz zapewnić unikalność tylko jednego z nich (uid
w takim przypadku), musisz zastosować inne podejście:
var user = { uid: userOid, ... };
Group.updateOne(
{name: 'admin', 'users.uid': {$ne: user.uid}},
{$push: {users: user}},
function(err, numAffected) { ... });
To, co robi, to kwalifikacja $push
aktualizacja występuje tylko wtedy, gdy user.uid
nie istnieje już w uid
pole dowolnego elementu users
. Więc naśladuje $addToSet
zachowanie, ale tylko dla uid
.