Ein eindeutiger Index für ein Array-Feld erzwingt, dass derselbe Wert nicht in den Arrays von mehr als einem Dokument erscheinen kann in der Sammlung, verhindert aber nicht, dass derselbe Wert mehr als einmal im Array eines einzelnen Dokuments erscheint. Sie müssen also die Eindeutigkeit sicherstellen, wenn Sie stattdessen Elemente zum Array hinzufügen.
Verwenden Sie das $addToSet
Operator, um einem Array einen Wert nur dann hinzuzufügen, wenn der Wert noch nicht vorhanden ist.
Group.updateOne({name: 'admin'}, {$addToSet: {users: userOid}}, ...
Wenn jedoch die users
array enthält Objekte mit mehreren Eigenschaften und Sie möchten die Eindeutigkeit nur für eines davon sicherstellen (uid
in diesem Fall), müssen Sie einen anderen Ansatz wählen:
var user = { uid: userOid, ... };
Group.updateOne(
{name: 'admin', 'users.uid': {$ne: user.uid}},
{$push: {users: user}},
function(err, numAffected) { ... });
Was das macht, ist den $push
zu qualifizieren Update findet nur statt, wenn user.uid
existiert noch nicht in der uid
Feld eines der Elemente von users
. Es ahmt also $addToSet
nach Verhalten, aber nur für uid
.