Mongoose Valores exclusivos em uma matriz aninhada de objects

Para o meu projeto, quero manter um documento de mangusto para grupos de organizações, como este:

var groupSchema = Schema({ name : { type : String }, org : { type : Schema.Types.ObjectId, ref : 'Organization' }, ... users : [{ uid : { type : Schema.Types.ObjectId, ref : 'User' }, ... }] }); 

Eu quero impedir que o mesmo usuário esteja no mesmo grupo duas vezes. Para fazer isso, preciso forçar users.uid para ser exclusivo na matriz de usuários. Eu tentei declarar ‘unique: true’ para uid, mas isso não funcionou. Existe uma maneira de fazer isso com o mangusto ou mongoDB sem consultas extras ou dividir o esquema?

Edit: Eu mudei o valor anterior de uid para uid: {type: Schema.Types.ObjectId, ref: ‘Usuário’, índice: {unique: true, dropDups: true}} Mas isso ainda não parece funcionar.

Edit: Supondo que não há uma maneira simples de conseguir isso, eu adicionei uma consulta extra verificando se o usuário já está no grupo. Isto parece-me o caminho mais simples.

Um índice exclusivo em um campo de matriz impõe 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 à medida que adiciona elementos à matriz.

Use o operador $addToSet para adicionar um valor a uma matriz somente se o valor não estiver presente.

 Group.update({name: 'admin'}, {$addToSet: {users: userOid}}, ... 

No entanto, se a matriz de users contiver objects com várias propriedades e você quiser garantir exclusividade sobre apenas um deles ( uid neste caso), será necessário adotar outra abordagem:

 var user = { uid: userOid, ... }; Group.update( {name: 'admin', 'users.uid': {$ne: user.uid}}, {$push: {users: user}}, function(err, numAffected) { ... }); 

O que isso faz é qualificar a atualização $push para ocorrer somente se user.uid ainda não existir no campo uid de qualquer um dos elementos dos users . Por isso, imita o comportamento $addToSet , mas apenas por uid .