在开始之前,我想说明没有其他类似问题的答案适用于此问题。首先考虑以下JSON代码
"_id": "1412302013-01-20,11:32:22"
"display": [
{
"Name": "LOG-11-05-SH-O1.mp4",
"Type": "Startup",
"Count": 2,
"Detail": [
{
"Start": "2013-01-20,11:32:22",
"End": "2013-01-20,11:32:30"
},
{
"Start": "2013-01-20,11:32:22",
"End": "2013-01-20,11:32:30"
}
]
},
{
"Name": "PUR-12-47-SH-X3.mp4",
"Type": "Movie",
"Count": "2",
"Detail": [
{
"Start": "2013-01-20,11:32:22",
"End": "2013-01-20,11:32:30"
},
{
"Start": "2013-01-20,11:32:22",
"End": "2013-01-20,11:32:30"
}
]
},
ID基本上是与时间戳同步的车牌号码的组合。
我要做的是汇总"Count"
的总和,"Name": "LOG-11-05-SH-O1.mp4"
。
我甚至无法将简单的总和汇总,因此尝试汇总这笔总和是不可能的。在NodeJS中运行我的脚本时,我得到undefined
或[object Object]
。
我不知道出现了什么问题,因为我一直关注各种在线示例。
在尝试使用parvin的答案之后,我仍然未定义:
collection.aggregate([
{$match : {"display.Name" : "LOG-11-05-SH-O1.mp4"}},
{$unwind : "$display"},
{$group : {_id : "$_id",
name : {$first : "$display.Name"},
total : {$sum : "$display.Count"}
}
}], function(err, result) {
console.log("Aggregation: " + result.total);
});
我一直在尝试格式化代码docs。
答案 0 :(得分:3)
aggregate
回调的result
参数是一个数组,而不是单个值。如果你只是转出result
:
console.log(result);
所以要访问数组中第一个doc的total
:
console.log(result[0].total);
但是那将是0,因为你的doc中的Count
是一个字符串,而不是一个数字。你不能$sum
字符串。
因为您还只想total
个"Name": "LOG-11-05-SH-O1.mp4"
元素,所以您需要在$unwind
之后添加另一个过滤器:
collection.aggregate([
{$match : {"display.Name" : "LOG-11-05-SH-O1.mp4"}},
{$unwind : "$display"},
{$match : {"display.Name" : "LOG-11-05-SH-O1.mp4"}},
{$group : {_id : "$_id",
name : {$first : "$display.Name"},
total : {$sum : "$display.Count"}
}
}], function(err, result) {
console.log(result);
});
答案 1 :(得分:1)
您可以使用以下查询查找Name = "LOG-11-05-SH-O1.mp4"
的总计数。这是javascript示例,您必须将其转换为node.js
db.collection.aggregate(
{$match : {"display.Name" : "LOG-11-05-SH-O1.mp4"}},
{$unwind : "$display"},
{$group : {_id : "$_id",
name : {$first : "$display.Name"},
total : {$sum : "$display.Count"}
}}
)