2012-09-09 13 views
6

Diciamo che voglio mantenere un elenco di elementi per utente (in MongoDB con Mongoose ODM nell'ambiente Node.js) e successivamente interrogare per vedere se un oggetto è di proprietà di un utente. Ad esempio, desidero memorizzare tutti i colori preferiti di ciascun utente e in seguito verificare se un determinato colore è di proprietà di un utente specifico. Mi sembra che sarebbe meglio memorizzare i colori come un oggetto incorporato all'interno del documento utente, piuttosto che una matrice all'interno del documento dell'utente. Il motivo è che sembra più efficace per controllare per vedere se un colore esiste in un oggetto come posso solo controllare per vedere se la proprietà oggetto esiste:Matrici MongoDB vs oggetti

if(user.colors.yellow){ 
    //true case 
} else { 
    //false case 
} 

Versus un array in cui devo scorrere la intero array per vedere se il colore esiste da qualche parte nella matrice:

for (var i = 0; i < user.colors.length; i++) { 
    if(user.colors[i] === "yellow"){ 
    //true case 
    } else { 
    //false case 
    } 
} 

Tuttavia, da molti degli esempi che ho visto on-line, sembra che l'utilizzo di matrici per questo tipo di cose è abbastanza diffuso. Mi sto perdendo qualcosa? Quali sono i pro/contro e il modo migliore per farlo?

+1

puoi fornire qualche collegamento a tali consigli? – c69

risposta

2

Non è necessario utilizzare un ciclo for se i colori sono memorizzati come array. Si può solo usare indexOf, come in:

if(user.colors.indexOf("yellow") != -1){ 
    //true case 
} 

Detto questo, in realtà non dovrebbe importare se in entrambi i casi si utilizza un documento o un array incorporato; non è che l'uno o l'altro possa dare un enorme vantaggio in termini di prestazioni.

+0

'Non è che l'uno o l'altro possa dare un enorme vantaggio in termini di prestazioni '. È vero?! E se sì, a quale scala. Se ci sono solo 8 colori, sarà trascurabile, una volta. Ma per quanto riguarda molti colori, o l'accesso in un ciclo molte volte? –

1

Spesso si vedono gli array incorporati utilizzati per archiviare questo tipo di informazioni nelle raccolte MongoDB perché se si aggiunge un indice alla proprietà dell'array sono efficienti da interrogare e utilizzano una sintassi naturale. In questo caso, qualcosa di simile alla seguente (assumendo una collezione utenti che contiene una proprietà di matrice di colori):

db.users.find({id: 1, colors: 'yellow'}) 

Se avete fatto queste cose con le singole proprietà del colore si avrebbe una query guardando più imbarazzante come questo e che ci si devi indicizzare separatamente ogni colore (anziché solo colors come sopra):

db.users.find({id: 1, 'colors.yellow': true})