Un índice único en un campo de matriz impone que el mismo valor no puede aparecer en las matrices de más de un documento en la colección, pero no evita que el mismo valor aparezca más de una vez en la matriz de un solo documento. Por lo tanto, debe garantizar la exclusividad al agregar elementos a la matriz.
Usa el $addToSet
operador para agregar un valor a una matriz solo si el valor aún no está presente.
Group.updateOne({name: 'admin'}, {$addToSet: {users: userOid}}, ...
Sin embargo, si los users
matriz contiene objetos con múltiples propiedades y desea garantizar la exclusividad de solo uno de ellos (uid
en este caso), entonces debe adoptar otro enfoque:
var user = { uid: userOid, ... };
Group.updateOne(
{name: 'admin', 'users.uid': {$ne: user.uid}},
{$push: {users: user}},
function(err, numAffected) { ... });
Lo que hace es calificar el $push
actualización para que solo ocurra si user.uid
aún no existe en el uid
campo de cualquiera de los elementos de users
. Entonces imita a $addToSet
comportamiento, pero solo para uid
.