2013-04-10 13 views
19

per il mio progetto, voglio mantenere un documento mangusta per gruppi di organizzazioni, come questo:valori Mongoose unici in array nidificato di oggetti

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

voglio evitare che lo stesso utente di essere nello stesso gruppo due volte. Per fare questo, ho bisogno di forzare users.uid ad essere unico nell'array degli utenti. Ho provato a indicare "unique: true" per uid, ma non ha funzionato. C'è un modo per farlo con mangusta o mongoDB senza ulteriori query o la divisione dello schema?

Edit: ho cambiato il valore precedente di uid a uid: {type: Schema.Types.ObjectId, ref: 'utente', indice: {unico: vero, dropDups: true}} Ma questo ancora doesn sembra funzionare.

Edit: Supponendo non v'è alcun modo semplice per raggiungere questo obiettivo, ho aggiunto una query in più controllare se l'utente è già nel gruppo. Questo mi sembra il modo più semplice.

+0

controllare questo sarà [utile] (http://stackoverflow.com/questions/12395118/mongodb-setting-unique-field) – karthick

+0

Grazie per il collegamento. Ho provato quanto segue: uid: {type: Schema.Types.ObjectId, ref: 'utente', indice: {unici: true, dropDups: true}} al posto del vecchio valore uid. Questo ancora non funziona, ho anche provato a riavviare mongoDB senza successo. –

risposta

61

Un indice univoco un campo di matrice fa rispettare che lo stesso valore non può apparire nelle matrici di più documento della collezione, ma non impedisce lo stesso valore di apparire più di una volta in matrice di un singolo documento . Quindi è necessario garantire l'univocità mentre si aggiungono elementi alla matrice.

Utilizzare l'operatore $addToSet per aggiungere un valore ad un array solo se il valore non è già presente.

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

Tuttavia, se la matrice users contiene oggetti con più proprietà e si desidera garantire l'unicità sopra solo uno di loro (uid in questo caso), allora avete bisogno di prendere un altro approccio:

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

ciò che fa è qualificano l'aggiornamento $push verificarsi solo se user.uid non esiste già nel uid campo di qualsiasi degli elementi di users. Quindi riproduce il comportamento di $addToSet, ma solo per uid.

+0

Ma come si può forzare solo uid ad essere unico? Nell'array degli utenti, ho più attributi che potrebbero essere diversi ogni volta che aggiungo lo stesso utente (come la data). –

+0

Grazie per l'input. Ho letto sui validatori, ma non vedo un modo più semplice di aggiungere una query aggiuntiva per verificare se l'utente è già nel gruppo. –

+0

@GuidoPassage Ho aggiunto un modo per supportare il tuo caso d'uso specifico. – JohnnyHK

Problemi correlati