如何使用 mongodb 聚合框架比较两个日期之间的分组数据
How to compare grouped data between two dates using the mongodb aggregate framework
考虑如下数据集
Sector Value Date
a 2 1/1/2015
b 5 1/1/2015
c 8 1/1/2015
a 3 1/1/2015
a 6 1/1/2015
a 1 1/1/2015
c 1 1/1/2015
Sector Value Date
a 2 2/1/2015
b 10 2/1/2015
b 5 2/1/2015
c 8 2/1/2015
有没有办法使用MongoDB聚合框架来查找两个日期的每个分组扇区之间的差异?
换句话说,是否有可能获得这样的输出:
a -> (2+3+6) - 2 = 10
b -> 5 - (10+5) = -10
c -> (8+1) - 8 = 1
使用聚合框架和 $cond
运算符更改 2015 年 2 月 1 日值的符号,这是一个简单的总和。
给定该测试集合:
{ name: 'a', value: 2, date: ISODate('2015-01-01') },
{ name: 'b', value: 5, date: ISODate('2015-01-01') },
{ name: 'c', value: 8, date: ISODate('2015-01-01') },
{ name: 'a', value: 3, date: ISODate('2015-01-01') },
{ name: 'a', value: 6, date: ISODate('2015-01-01') },
{ name: 'a', value: 1, date: ISODate('2015-01-01') },
{ name: 'c', value: 1, date: ISODate('2015-01-01') },
{ name: 'a', value: 2, date: ISODate('2015-01-02') },
{ name: 'b', value: 10, date: ISODate('2015-01-02') },
{ name: 'b', value: 5, date: ISODate('2015-01-02') },
{ name: 'c', value: 8, date: ISODate('2015-01-02') }
以下是实现预期结果的方法:
db.collection.aggregate([
{ $match: { date: { $in: [ ISODate('2015-01-01'), ISODate('2015-01-02') ] }}},
{ $project: { name: 1,
value: { $cond: [ {$eq: [ "$date", ISODate('2015-01-01')]},
"$value",
{ $subtract: [0, "$value"] } ]}}},
{ $group: { _id: "$name", total: { $sum: "$value" }}}
])
$match
阶段仅保留给定两天的值$project
阶段将保持日期等于"2015-01-01"的文档的值不变,但将更改日期等于"2015-01-02"的文档的值符号- 最后,
$group
阶段将对所有值(正值和负值)求和。
生产:
{ "_id" : "c", "total" : 1 }
{ "_id" : "b", "total" : -10 }
{ "_id" : "a", "total" : 10 }
相关文章:
- 如何在javascript中获取两个日期之间的周六和周日的日期
- 如何用moment.js列出两个日期之间的所有月份
- 两个日期时间选择器
- 如何在JavaScript中比较两个日期
- moment.js在两个时区格式的日期之间存在差异
- Javascript-如何使用bootstrap日期时间选择器自动计算两个时间输入之间的差异
- Javascript两个日期选择器冲突
- 如何从日期范围选择器中获取两个日期
- 用时间戳获取两个不同日期之间的时间差
- JavaScript函数,用于计算两个日期之间的年、月和天数
- 使用javascript将两个输入的日期添加在一起
- 再次使用JavaScript计算两个日期之间的天数
- Mongoose查询在两个日期时间之间提取数据
- 在Javascript中计算两个日期之间的工作日,节假日除外
- 在Jquery或Javascript中获取两个范围或日期之间的通信周数
- 两个日期之间的差异
- JavaScript-计算两个日期之间的天数(包括结束日期)
- 在 JavaScript 中单击函数时两个日期类型输入之间的差异的代码
- 如何将日期和时间拆分为两个元素
- 当前日期两个时间之间的时间