2016-04-09 31 views
0

我是新來的MongoDB,並有一個表BOXTABLE像下面查詢 - 選擇框,COUNT(*)from表where GROUP BY

boxname 
time_created 
box_data 

基本上我們會記錄該箱發送什麼數據和在什麼時間。假設表中有如下數據,現在意味着當前時間:

BoxA,Now,'AAA' 
BoxB,Now,'AAA' 
BoxC,Now,'AAA' 
BoxA,Now,'AAA' 
BoxA,Now,'AAA' 
BoxB,Now,'AAA' 
BoxA,Now,'AAA' 
BoxC,Now,'AAA' 
BoxA,Now,'AAA' 
BoxB,Now,'AAA' 

所以我需要得到的數據是這樣的:

BoxA - 5 
BoxB - 3 
BoxC - 2 

現在,我的要求是,是,如果在系統中創建一個警報方框發送的請求超過閾值,可能表明該方框中可能存在某些錯誤或可疑內容。假設當前閾值是4所以我應該得到的警報BOXA:

這樣我的要求是執行一個查詢是這樣的:

SELECT BOXNAME,COUNT(BOX_DATA) FROM BOXTABLE WHERE time_create >= now and time_create < now + 600 

我試過相同,但ñ加時賽肯定爲什麼它不工作:

db.collection.aggregate([{"$group" : {"$id" : "$boxname", count:{"$box_data":1}}, time_created: {"$gte":start,"$lt":end}}]) 

哪裏開始和結束都象下面這樣:

start = int(time.time()) 
end = start + 600 

是我的代碼正確的 - 當我運行我得到以下錯誤

NameError: name 'count' is not defined 

回答

1

你需要一個$match過濾範圍以及$group這裏。而正確的方式來「算」使用$sum{ "sum": 1 }爲每一個「分組」值:

db.collection.aggregate([ 
    { "$match": { 
     "time_created": { "$gte":start, "$lt":end } 
    }}, 
    { "$group": { 
     "_id": "$boxname", 
     "count": { "$sum": 1 } 
    }} 
]) 

$match是「過濾器」,相當於"WHERE",作爲$group"GROUP BY"

作爲一個「管道」,每個階段都會按順序輸出到下一個階段。這是適應思維的主要觀點。先過濾,然後「組」。

如果您然後想要一個"HAVING"子句,那麼您將在$group流水線階段之後類似地「$match」。

db.collection.aggregate([ 
    { "$match": { 
     "time_created": { "$gte":start, "$lt":end } 
    }}, 
    { "$group": { 
     "_id": "$boxname", 
     "count": { "$sum": 1 } 
    }}, 
    { "$match": { "count": { "$gt": 4 } } } 
]) 

而這與在一條SQL語句的末尾說"HAVING count > 4"相同。

+0

感謝它的幫助,但又一個小的幫助 - 如何檢查閾值也意味着我需要列出時間範圍內的數據和記錄(boxnames),其結果中的記錄數超過4根據我的例? – Prakash

+1

@Prakash我相信你的意思是一個「HAVING」條款。然而,在將來,如果您對實際問題有其他問題,請[提出新問題](http://stackoverflow.com/questions/ask)。 –

+0

非常感謝您的幫助 - 它幫助了很多。感謝您提供的指導和細節 - 我會遵循規則 – Prakash