Mongodb查询按多个字段分组并过滤

时间:2017-08-15 14:51:38

标签: mongodb

我希望能够将每个" Place"随着时间的推移,有多少" PatientIds"他们在某一天看到,然后能够通过行动来过滤这个。

基本上患者在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 } }
>

1 个答案:

答案 0 :(得分: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"  }