2013-07-31 10 views
6

Mam tabelę MYSQL z zapisami nazwisk osób i czasem przybycia wyrażonym jako liczba. Pomyśl o tym jak o maratonie. Chcę wiedzieć, ile osób przybyło w pewnym odstępem czasu, który gdzie nazwie takie same, więc:Migracja do MongoDB: jak zapytać GROUP BY + WHERE

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

I jak wyniki uzyskać:

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

mam migracji do MongoDB teraz i używanie Pythona do kodowania (więc proszę o pomoc Pymongo). Próbowałem szukać informacji na temat odpowiednika GROUP BY (nawet gdy przeczytałem, że bazy danych NoSQL są gorsze w tego typu operacjach niż te SQL), ale odkąd wydali nowy API agreggate, nie mogłem znaleźć prosty przykład, taki jak ten rozwiązany przy użyciu metody grupowej, metody Map-Reduce lub zupełnie nowego API agreggate.

Każda pomoc?

Odpowiedz

17

Istnieją przykłady tej całej dokumentacji, Google i tej strony.

Niektóre referencje:

I z jakiegoś kodu:

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

Myślę, że przy użyciu $ name jest co mnie wątpliwości jak to zrobić, ponieważ nazwa jest nazwą pola w bazie danych, a nie znacznikiem pymongo. Dlaczego nazwa pola do zgrupowania jest wyrażana w ten sposób? –

+1

@RomanRdgz Jeśli jestem szczery, nie wiem, to była decyzja projektowa, że ​​musiałbyś zapytać o 10gen, jednak bez '$' ciąg jest traktowany jako literał w MongoDB, to '$' sprawia, że MongoDB reaguje tak, jakby była wartością pola – Sammaye