2012-04-09 27 views
7

Ho uno schema simile amongo db interrogazione valori di matrice con maggiore e minore di

{ 
    'user_id' : 1, 
    'marks' : [10, 40] 
} 

Voglio trovare il numero di utenti che hanno segnato marchi tra 20 e 30 almeno una volta.

ho provato la seguente query

db.users.count({ 
    'marks' : {$gte: '20', $lt: '30'} 
}) 

Ma questo incluso anche quelli con segni di più di 30 ...

+0

esatto duplicato con http://stackoverflow.com/questions/6038818/mongodb-query-to-match-each-element-in-doc-array-to-a-condition – Nat

+0

grazie, ho cercato domande simili ma non ho trovato uno ... – Rishabh

+2

nella tua query stai usando le stringhe invece dei numeri. – cantdutchthis

risposta

1

Quindi supponendo che hai avuto i seguenti dati in punteggi di raccolta:

{ 'user_id' : 1, 'marks' : [ 10, 40 ] } 
{ 'user_id' : 2, 'marks' : [ 5, 18 ] } 
{ 'user_id' : 3, 'marks' : [ 15, 25 ] } 
{ 'user_id' : 4, 'marks' : [ 22, 33 ] } 

Quindi ci si aspetta di filtrare user_ids 3 e 4, un conteggio di 2.

Il modo più semplice per eseguire la query è quello di fare:

db.scores.count({'marks':{$in: [20,21,22,23,24,25,26,27,28,29,30]}}) 

ma non abbastanza ...

+0

si stava pensando di non farlo. accetterà questo dato che non sembra esserci altra opzione n. – Rishabh

4

non si tratta solo di questo:

db.scores.count({ 'marks' : { '$gt' : min_value , '$lt' : max_value } }) 

che nel tuo caso si tradurrebbe a:

+1

, in questo scenario il set di dati [10,40] è selezionato come – Rishabh

16

Utilizzare $elemMatch per vincolare entrambe le parti dell'intervallo di query al numero sam emarks elemento:

db.users.count({ 
    marks: {$elemMatch: {$gte: 20, $lt: 30}} 
}) 
Problemi correlati