Javascript mongodb中的条件聚合函数

Javascript mongodb中的条件聚合函数,javascript,mongodb,mongoose,aggregation-framework,mongodb-aggregation,Javascript,Mongodb,Mongoose,Aggregation Framework,Mongodb Aggregation,我有一个mongodb,它的数据如下 { "_id": "a", "reply": "<", "criterion": "story" }, { "_id": "b", "reply": "<", "criterion": "story" }, { "_id": "c", "reply": ">", "criterion": "story" } { “_id”:“a”, “答复”:“:1, “您需要使用聚合框架,在该框架中运行一个聚合管道,

我有一个mongodb,它的数据如下

{
  "_id": "a",
  "reply": "<",
  "criterion": "story"
},
{
  "_id": "b",
  "reply": "<",
  "criterion": "story"
},
{
  "_id": "c",
  "reply": ">",
  "criterion": "story"
}
{
“_id”:“a”,
“答复”:“:1,

“您需要使用聚合框架,在该框架中运行一个聚合管道,该聚合管道具有一个操作符管道阶段,该阶段使用累加器操作符聚合文档以创建所需的计数

为了获得所需的结果,您需要使用像这样的十进制运算符来创建独立的计数字段,因为这将根据名称值将文档数馈送到表达式。可以有效地使用运算符根据
回复
字段值。它将逻辑条件作为第一个参数(if),然后返回第二个参数,其中计算结果为真(then),或者返回第三个参数,其中计算结果为假(else)。这将
true/false
布尔计算返回值转换为1和0,并分别输入

"$cond": [
    { "$eq": ["$reply", ">"] },
    1, 0
]
因此,如果在正在处理的文档中,
“$reply”
字段有一个
“>”
值,运算符将值1馈送给,否则它将求和为零值

使用作为最后的管道步骤,因为它允许您使用数学表达式、日期、字符串和/或逻辑(比较、布尔、控制)重塑流中的每个文档,包括、排除或重命名字段,注入计算字段,创建子文档字段它类似于SQL中的
SELECT

以下管道应返回所需的结果:

Model.aggregate([
    {
        "$group": {
            "_id": "$criterion",
            ">": {
                "$sum": {
                    "$cond": [ 
                        { "$eq": [ "$reply", ">" ] }, 
                        1, 0 
                    ]
                }
            },
            "<": {
                "$sum": {
                    "$cond": [ 
                        { "$eq": [ "$reply", "<" ] }, 
                        1, 0 
                    ]
                }
            }
        }
    },
    {
        "$project": {
            "_id": 0,
            "criterion": "$_id",
            "result.>": "$>",
            "result.<": "$<"
        }
    }
]).exec(function(err, result) {
    console.log(JSON.stringify(result, null, 4));
});
控制台输出示例

{
    "criterion" : "story",
    "result" : {
        ">" : 1,
        "<" : 2
    }
}
{
    "_id" : "story",
    "result" : [ 
        {
            "reply" : "<",
            "count" : 2
        }, 
        {
            "reply" : ">",
            "count" : 1
        }
    ]
}
{
“_id”:“故事”,
“结果”:[
{
“答复”:“,
“计数”:1
}
]
}

这是一部非常出色的作品,非常感谢@chridam,它真的很有帮助。你马上就明白了我的问题。@neaGaze不用担心,总是很乐意帮忙:)
Model.aggregate([
    { 
        "$group": {
            "_id": {
                "criterion": "$criterion",
                "reply": "$reply"
            },
            "count": { "$sum": 1 }
        }
    },
    { 
        "$group": {
            "_id": "$_id.criterion",
            "result": {
                "$push": {
                    "reply": "$_id.reply",
                    "count": "$count"
                }
            }
        }
    }
]).exec(function(err, result) {
    console.log(JSON.stringify(result, null, 4));
});
{
    "_id" : "story",
    "result" : [ 
        {
            "reply" : "<",
            "count" : 2
        }, 
        {
            "reply" : ">",
            "count" : 1
        }
    ]
}