2017-08-15 118 views
0

我希望能夠將每個「地點」隨時間分組顯示,他們在給定日期內看到多少個「患者標識號」,然後能夠按照行動是。Mongodb查詢按多個字段進行分組並進行篩選

基本上y軸上的患者,x軸上的日期,然後是過濾器或堆疊圖表來顯示動作。我也想過mapreduce,但從來沒有這樣做過mongo

我找不出正確的mongo查詢。現在我有:

db.collection.aggregate({"$group":{_id:{place:"$place",date:"$date",action:"$action",count:{$sum:1}}},{$sort:{"_id.date":1,"_id.place":1}}) 

但是,這只是列出了數據。我試圖在所有地方進行比賽,但是這並沒有給我我想要的結果。有任何想法嗎?

例JSON:

{ 
    "_id" : ObjectId(""), 
    "patientId" : "100", 
    "place" : "1", 
    "action" : "DIAGNOSED", 
    "date" : ISODate("2017-01-20") 
} 
{ 
    "_id" : ObjectId(""), 
    "patientId" : "101", 
    "place" : "1", 
    "action" : "PATIENT IN", 
    "date" : ISODate("2017-01-20) 
} 
{ 
    "_id" : ObjectId(""), 
    "patientId" : "200", 
    "place" : "2", 
    "action" : "MEDICINE", 
    "date" : ISODate("2017-01-05") 
} 
{ 
    "_id" : ObjectId(""), 
    "patientId" : "300", 
    "place" : "2", 
    "action" : "DIAGNOSED", 
    "date" : ISODate("2017-01-31") 
} 

編輯 - MapReduce的

> var map = function(){emit(this.place,1)} 
> var reduce = function(key,values){var res = 0;values.forEach(function(v){res+=1});return{count:res};} 
> db.new.mapReduce(map,reduce,{out:"mapped_places"}); 
{ 
    "result" : "mapped_places", 
    "timeMillis" : 88, 
    "counts" : { 
     "input" : 4, 
     "emit" : 4, 
     "reduce" : 2, 
     "output" : 2 
    }, 
    "ok" : 1 
} 
> db.mapped_offices.find({}) 
{ "_id" : "1", "value" : { "count" : 2 } } 
{ "_id" : "2", "value" : { "count" : 2 } } 
> 
+0

不能完全確定是什麼問題,但你的查詢有語法錯誤。應該是db.collection.aggregate({「$ group」:{_ id:{date:「$ date」,place:「$ place」,action:「$ action」},count:{$ sum:1}} },{$排序:{ 「_ id.date」:1, 「_ id.place」:1}})'。請考慮在帖子中添加預期的輸出並輸入(如果有的話)。 – Veeram

+0

我想總計每個地點每個日期的患者人數。所以,放置:「1」,在2017-01-20有兩項索賠,但是有兩種不同的操作,所以當我製作圖表時,我希望能夠一次查看所有內容或通過某種操作 – user6754289

+0

因此,您只需要在某些情況下通過匹配過濾器。類似於'db.collection.aggregate({$ match:{action:「someaction」}},{「$ group」:{_ id:{date:「$ date」,place:「$ place」},count :{$總和:1}}},{$排序:{ 「_ id.date 」:1,「 _ id.place」:1}})'。對於所有操作,我在前面的評論中發佈的查詢應該可以工作。 – Veeram

回答

1

你可以試試下面的聚集查詢。

db.collection.aggregate([ 
    { 
    "$group": { 
     "_id": { 
     "date": "$date", 
     "place": "$place" 
     }, 
     "actions": { 
     "$push": "$action" 
     }, 
     "count": { 
     "$sum": 1 
     } 
    } 
    }, 
    { 
    "$unwind": "$actions" 
    }, 
    { 
    "$sort": { 
     "_id.date": 1, 
     "_id.place": 1 
    } 
    } 
]); 

這應該輸出像

{ "_id" : { "date" : ISODate("2017-01-20T00:00:00Z"), "place" : "1"}, "count" : 2, "actions" : "PATIENT IN" } 
{ "_id" : { "date" : ISODate("2017-01-20T00:00:00Z"), "place" : "1"}, "count" : 2, "actions" : "DIAGNOSED" } 
+0

感謝您的幫助 – user6754289

相關問題