在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的管道还是起了作用。谢谢非常圆滑!谢谢