Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在MongoDB的另一个字段上分组的文档中,字段中字符串实例的计数?_Mongodb_Mongodb Query_Aggregation Framework - Fatal编程技术网

在MongoDB的另一个字段上分组的文档中,字段中字符串实例的计数?

在MongoDB的另一个字段上分组的文档中,字段中字符串实例的计数?,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我有一个特定的用例,我正试图找到一种方法在一个聚合管道中完成它,最好不需要硬编码任何数据值。我希望基于一个属性对文档进行分组,并查看文档中特定字段的值计数 示例数据: { "flightNum": "DL1002", "status": "On time", "date": 20191001 }, { "flightNum": "DL1002", "status": "Delayed", "date": 20191002 }, { "fli

我有一个特定的用例,我正试图找到一种方法在一个聚合管道中完成它,最好不需要硬编码任何数据值。我希望基于一个属性对文档进行分组,并查看文档中特定字段的值计数

示例数据:

{
    "flightNum": "DL1002",
    "status": "On time",
    "date": 20191001
},
{
    "flightNum": "DL1002",
    "status": "Delayed",
    "date": 20191002
},
{
    "flightNum": "DL1002",
    "status": "On time",
    "date": 20191003
},
{
    "flightNum": "DL1002",
    "status": "Cancelled",
    "date": 20191004
},
{
    "flightNum": "DL952",
    "status": "On time",
    "date": 20191003
},
{
    "flightNum": "DL952",
    "status": "On time",
    "date": 20191004
}
{
    "flightNum": "DL1002",
    "numOnTime": 2,
    "numCancelled": 1,
    "numDelayed": 1
},
{
    "flightNum": "DL952",
    "numOnTime": 2
}
我想要一个聚合管道,可以告诉我,对于每个航班(按flightNum分组),有多少航班“准时”、“延误”或“取消”

期望的响应:

{
    "flightNum": "DL1002",
    "status": "On time",
    "date": 20191001
},
{
    "flightNum": "DL1002",
    "status": "Delayed",
    "date": 20191002
},
{
    "flightNum": "DL1002",
    "status": "On time",
    "date": 20191003
},
{
    "flightNum": "DL1002",
    "status": "Cancelled",
    "date": 20191004
},
{
    "flightNum": "DL952",
    "status": "On time",
    "date": 20191003
},
{
    "flightNum": "DL952",
    "status": "On time",
    "date": 20191004
}
{
    "flightNum": "DL1002",
    "numOnTime": 2,
    "numCancelled": 1,
    "numDelayed": 1
},
{
    "flightNum": "DL952",
    "numOnTime": 2
}

字段的命名并不重要,因为它们存在于一个文档中。我发现我可以用操作符来实现这一点,但这需要我硬编码“status”字段的预期值。对于这个任意的例子,没有太多的值,但是如果添加了另一个状态,我希望不必更新查询。既然Mongo有这么多漂亮的把戏,我觉得有可能实现这一点

您可以尝试以下查询:

db.collection.aggregate([
    /** Group all docs based on flightNum & status & count no.of occurances */
    {
        $group: {
            _id: {
                flightNum: "$flightNum",
                status: "$status"
            },
            count: {
                $sum: 1
            }
        }
    },
    /** Group on flightNum & push an objects with key as status & value as count */
    {
        $group: {
            _id: "$_id.flightNum",
            status: {
                $push: {
                    k: "$_id.status",
                    v: "$count"
                }
            }
        }
    },
    /** Recreate status field as an object of key:value pairs from an array of objects */
    {
        $addFields: {
            status: {
                $arrayToObject: "$status"
            }
        }
    },
    /** add flightNum inside status object */
    {
        $addFields: {
            "status.flightNum": "$_id"
        }
    },
    /** Replace status field as new root for each doc in coll */
    {
        $replaceRoot: {
            newRoot: "$status"
        }
    }
])

测试:

在whoami的@RyanGunner中添加了一些糖:糟糕,我忽略了必需的o/p&没有将状态字段名称转换为必需的o/p,谢谢!!哎呀,我意识到我增加了一个额外的航班号,这不是我的本意,所以我的预期结果与我的数据不符。我修好了。尽管如此,whoami的管道还是起了作用。谢谢非常圆滑!谢谢