2013-07-31 14 views
6

Ho una tabella MYSQL con i record dei nomi delle persone e l'ora di arrivo espressa come un numero. Pensa a una maratona. Voglio sapere quante persone sono arrivati ​​in un certo intervallo di tempo, che dove il nome stesso, in modo da:Migrazione a MongoDB: come interrogare GROUP BY + WHERE

SELECT name, COUNT(*) FROM mydb.mytable 
WHERE Time>=100 AND Time<=1000 
GROUP BY name 

E i risultati che ottengo:

Susan, 1 
John, 4 
Frederick, 1 
Paul, 2 

sto migrazione a MongoDB ora, e usando Python per codificare (quindi sto chiedendo aiuto per Pymongo). Ho provato a cercare informazioni sull'equivalente GROUP BY (anche quando ho letto che i database NoSQL sono peggiori di questo tipo di operazioni rispetto a quelli SQL), ma da quando hanno rilasciato la nuova API agreggata, non sono stato in grado di trovare un esempio semplice come questo risolto con il metodo group, il metodo Map-Reduce o la nuovissima API agreggate.

Qualsiasi aiuto?

risposta

17

Ci sono esempi di questo in tutta la documentazione, Google e questo sito.

Alcune referenze:

E per un certo codice:

self.db.aggregate(
    # Lets find our records 
    {"$match":{"Time":{"$gte":100,"$lte":1000}}}, 

    # Now lets group on the name counting how many grouped documents we have 
    {"$group":{"_id":"$name", "sum":{"$sum":1}}} 
) 
+0

penso che l'utilizzo di $ nome è quello che mi ha fatto dubbiocome farlo, poiché il nome è il nome del campo nel database, non un tag pymongo. Perché il nome del campo da raggruppare è espresso in questo modo? –

+1

@RomanRdgz Se sono onesto non lo so, è stata una decisione di progettazione che dovresti chiedere a 10gen, tuttavia, senza '$' la stringa viene considerata letterale all'interno di MongoDB, è il '$' che rende MongoDB reagisce come se fosse un valore di campo – Sammaye