2012-05-07 26 views
9

ho raccolta di gioco nel mio DB:MongoDB trovare un documento con tutti i documenti secondari soddisfare una condizione

var game = { 
    players: [{username:"user1", status:"played"}, 
      {username:"user2", status:"accepted"}] 
} 

Per quanto ho capito query come questa: db.games.find({"players.status":"played"}) mi darà tutti i giochi in cui almeno un giocatore ha lo status "giocato". Come posso trovare giochi con TUTTI i giocatori con lo stato "giocato"?

+0

Ecco una discussione con una soluzione più flessibile: http : //stackoverflow.com/questions/11823296/mongodb-find-subdocument-in-array-matching-parameters/11823340#11823340 –

risposta

11

Se si dispone di una sola altra condizione di "suonato" utilizzare la query:

db.games.find({ "players.status": { $ne:"accepted" } }) 

È possibile regolare la query per gestire più valori di stato, purché sono tutti noti al momento della query .

+1

Ecco come l'ho fatto. Mi chiedo ancora se c'è un modo migliore, poiché ora devo cambiare la query ogni volta che aggiungo un nuovo stato di gioco. – andr111

+1

Puoi rendere dinamica la tua query: se crei un insieme di tutti i valori di stato come array, rimuovi "riprodotto" da esso e usalo con $ nin (non in) operazione che dovrebbe funzionare. –

+0

Grazie, immagino che questo sia l'unico modo per farlo. – andr111

-1

Utilizzare la funzione di $ di svolgimento del quadro aggregazione:

db.collection.aggregate ([{$ rilassarsi: "$ players.status"}, {$ partita: { "players.status": "giocato "}, {$ progetto: {" _ id ": 0," players.status ": 1}}])

(verificare questa risposta: https://stackoverflow.com/a/15082321/1214167)

+1

che non corrisponde a quello che l'OP vuole - questo restituirà solo i giocatori che hanno lo status "giocato" - il problema era quello di restituire squadre in cui tutti i giocatori hanno giocato. Puoi farlo con l'aggregazione estendendo la query per contare il numero di giocatori che hanno giocato e confrontandolo con le dimensioni dell'array completo, ma è più complesso e lento della semplice ricerca. –

Problemi correlati