MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Valores únicos do Mongoose em uma matriz aninhada de objetos


Um índice exclusivo em um campo de matriz garante que o mesmo valor não possa aparecer nas matrizes de mais de um documento na coleção, mas não impede que o mesmo valor apareça mais de uma vez na matriz de um único documento. Portanto, você precisa garantir a exclusividade ao adicionar elementos à matriz.

Use o $addToSet operador para adicionar um valor a uma matriz somente se o valor ainda não estiver presente.
Group.updateOne({name: 'admin'}, {$addToSet: {users: userOid}}, ...

No entanto, se os users array contém objetos com várias propriedades e você deseja garantir exclusividade sobre apenas um deles (uid neste caso), então você precisa tomar outra abordagem:
var user = { uid: userOid, ... };
Group.updateOne(
    {name: 'admin', 'users.uid': {$ne: user.uid}}, 
    {$push: {users: user}},
    function(err, numAffected) { ... });

O que isso faz é qualificar o $push atualização ocorra apenas se user.uid ainda não existe no uid campo de qualquer um dos elementos de users . Então, ele imita $addToSet comportamento, mas apenas para uid .