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 } }
>
不能完全確定是什麼問題,但你的查詢有語法錯誤。應該是db.collection.aggregate({「$ group」:{_ id:{date:「$ date」,place:「$ place」,action:「$ action」},count:{$ sum:1}} },{$排序:{ 「_ id.date」:1, 「_ id.place」:1}})'。請考慮在帖子中添加預期的輸出並輸入(如果有的話)。 – Veeram
我想總計每個地點每個日期的患者人數。所以,放置:「1」,在2017-01-20有兩項索賠,但是有兩種不同的操作,所以當我製作圖表時,我希望能夠一次查看所有內容或通過某種操作 – user6754289
因此,您只需要在某些情況下通過匹配過濾器。類似於'db.collection.aggregate({$ match:{action:「someaction」}},{「$ group」:{_ id:{date:「$ date」,place:「$ place」},count :{$總和:1}}},{$排序:{ 「_ id.date 」:1,「 _ id.place」:1}})'。對於所有操作,我在前面的評論中發佈的查詢應該可以工作。 – Veeram