如何根据mongodb和mongoose的调查结果进行分组?

如何根据mongodb和mongoose的调查结果进行分组?,mongodb,mongoose,mongodb-query,aggregation-framework,Mongodb,Mongoose,Mongodb Query,Aggregation Framework,我的应用程序中有一个动作集合,具有以下对象结构: { "type" : "evMove", "userId" : "55fbbb2a34d594085988aa70", "data" : { "evId" : "55fdaa53cca301f758f4023d", "moveId" : "55fdaa53cca301f758f4023f" } }, {

我的应用程序中有一个动作集合,具有以下对象结构:

    {
        "type" : "evMove",
        "userId" : "55fbbb2a34d594085988aa70",
        "data" : {
            "evId"   : "55fdaa53cca301f758f4023d",
            "moveId" : "55fdaa53cca301f758f4023f"
        }
    },
    {
        "type" : "game",
        "userId" : "55fgdfa34d594085988aa70",
        "data" : {
            ...
        }
    },
    {
        "type" : "evMove",
        "userId" : "55fbbb2aasd34d595988aa60",
        "data" : {
            "evId"   : "55fdaa53cca301f758f4023d",
            "moveId" : "55fdaa53cca301f758f4023f"
        }
    },
{
        "type" : "evMove",
        "userId" : "55fbbb2a34d594085988aa30",
        "data" : {
            "evId"   : "55fdaa53cca301f758f4023d",
            "moveId" : "55fdaa53cca301f758f4023g"
        }
    }
我需要在mongodb和mongoose中返回返回以下结果:

 for event id: 55fdaa53cca301f758f4023d

  moveId:55fdaa53cca301f758f4023d, count:2
  moveId:55fdaa53cca301f758f4023g, count:1
这意味着,如果我使用javascript进行此操作,并且不使用group by like查询:

db.actions.find({'type':'evMove','data.evId':'55fdaa53cca301f758f4023d'})

 resultArray = {
       55fdaa53cca301f758f4023d : 0,
       55fdaa53cca301f758f4023g : 0
    };
    results.forEach(function(res){
         resultArray[res.data.evMove]++;
    );
我怎样才能在mongodb和mongoose中进行分组,从而或多或少地得到我想要的结果(移动和计数)?

您想要哪个可以在指定的键上“分组”。首先,您对这两种结果进行分组,虽然不完全按照您要求的格式进行分组,但第二种方法会将结果“汇总”到一个数组中:

Model.aggregate([
{“$match”:{
“类型”:“evMove”,
“data.evId”:新的ObjectId(“55fdaa53cca301f758f4023d”)
}},
{“$组”:{
“_id”:{
“evId”:“$data.evId”,
“moveId”:“$data.moveId”
},
“计数”:{“$sum”:1}
}},
{“$组”:{
“_id”:“$_id.evId”,
“动作”:{
“$push”:{
“moveId”:“$\u id.moveId”,
“计数”:“$count”
}
}
}}
],函数(错误,结果){
//结果在这里
});
这会产生如下结果:

{
“_id”:“55fdaa53cca301f758f4023d”,
“动作”:[
{“moveId”:“55fdaa53cca301f758f4023d”,“count”:2}
{“moveId”:“55fdaa53cca301f758f4023g”,“count”:1}
]
}

还要注意的是,如果您希望“multiple”
eventId
值使用此选项,则只需从列表中删除该行即可


当然,由于聚合管道不执行mongoose在其他
.find()
类型操作(基于模式)中执行的“自动广播”,因此您需要自己“强制广播”类型。因此,核心驱动程序提供了
ObjectId
方法。但是,只有当您需要将内容与这样的
\u id
值进行
$匹配时,才需要这样做,因为所有其他评估都是管道本身内部的。

那么您想要什么呢?它是每个不同的
evId
值的不同
moveId
值的计数吗?是!正如你所说,在我的查询中,它将更加具体,这意味着,只有一个evId,而不是我的所有操作表evId…我有一个evId,对于它,我有4个选项供用户选择(moveId),我只想计算有多少用户选择了一个移动而不是另一个,一次只选择一个evId