2013-07-31 79 views
6

我有一個MYSQL表,其中包含人名記錄以及到達時間,表示爲一個數字。把它想象成馬拉松。我想知道有多少人進抵的時間有一定的差距誰在那裏命名一樣,所以:遷移到MongoDB:如何查詢GROUP BY + WHERE

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

而作爲結果我得到:

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

我遷移到現在的MongoDB,並使用Python進行編碼(所以我要求Pymongo的幫助)。我試圖尋找關於GROUP BY等價物的信息(即使當我讀到NoSQL數據庫在這種操作上比SQL更糟糕)時,但是由於他們發佈了新的agreggate API,我無法找到像這樣的簡單例子通過組方法,Map-Reduce方法或全新的agreggate API解決。

任何幫助?

回答

17

這裏有遍及文檔,谷歌和本網站的例子。

一些參考:

而對於一些代碼:

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

我覺得用$名字是什麼疑問讓我如何做到這一點,因爲name是數據庫中字段的名稱,而不是pymongo標籤。爲什麼要通過表達方式來組合這個字段的名稱? –

+1

@RomanRdgz如果我是誠實的,我不知道,這是一個設計決定,你不得不去問10gen,然而,如果沒有'$'這個字符串在MongoDB中被視爲字面值,它就是'$' MongoDB的反應就像是一個字段值 – Sammaye