javascript - 如何使用 mongodb 聚合框架比较两个日期之间的分组数据

标签 javascript mongodb aggregation-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运算符更改 2/1/2015 值的符号,这是一个简单的求和。

鉴于该测试集合:

{ 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”的文档的值sign
  • 最后,$group阶段将对所有值(正值和负值)求和。

制作:

{ "_id" : "c", "total" : 1 }
{ "_id" : "b", "total" : -10 }
{ "_id" : "a", "total" : 10 }

关于javascript - 如何使用 mongodb 聚合框架比较两个日期之间的分组数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30946493/

相关文章:

javascript - appendChild 错误 : Node cannot be inserted at the specified point in the hierarchy

javascript - 异步延迟 JS 直到满足条件

java - 将 MongoDb 查询转换为 Java BasicDbObject

java - Spring boot 2.0.5.RELEASE 和 mongo 4.0 连接问题

arrays - MongoDB 多个嵌套数组的大小

javascript - 我可以根据 JavaScript 函数的结果更改我的 HTML 网格对象的类吗?

mongodb - $Push 如果对象不存在

mongodb - MongoDB聚合框架的绝对值

python - 如何将两个聚合查询合并为一个

javascript - 如何访问 module.exports 中的对象属性