mongodb - 当前字段的聚合条件计数

标签 mongodb mongodb-query aggregation-framework

我正在尝试编写一个聚合来计算有多少文档具有某些字段(即只计算它们是否存在)。对象看起来像这样:

{
        "_id" : ObjectId("5617731fe65e0b19101c7039"),
        "dateCreated" : ISODate("2015-10-09T07:56:15.068Z"),
        "dateSent" : ISODate("2015-10-09T07:56:16.682Z"),
        "dateAttempted" : ISODate("2015-10-09T07:56:16.682Z")
},
{
        "_id" : ObjectId("561e37bb537d381bb0ef0ae2"),
        "dateCreated" : ISODate("2015-10-14T11:08:43.306Z"),
        "dateSent" : ISODate("2015-10-14T11:09:51.618Z"),
        "dateAttempted" : ISODate("2015-10-14T11:09:51.618Z"),
        "dateViewed" : ISODate("2015-10-15T10:09:50.618Z"),
        "dateOpened" : ISODate("2015-10-15T10:10:01.618Z")
}

我想遍历所有文档,计算该字段存在的位置。期望的输出:

{
        "total" : 1000,
        "created" : 1000,
        "sent" : 990,
        "attempted" : 995
        "viewed" : 800,
        "opened" : 750
}

如果每天可以将此输出分组,则可加分!我不希望对范围内的每个日期执行新的聚合。

这是我目前所拥有的,但没有用;它为每个字段返回零

[
  {
    "$group": {
      "_id": {
        "$dayOfMonth": "$dateCreated"
      },
      "total": {
        "$sum": 1
      },
      "sent": {
        "$sum": "$dateSent"
      },
      "attempted": {
        "$sum": "$dateAttempted"
      },
      "viewed": {
        "$sum": "$dateViewed"
      },
      "clicked": {
        "$sum": "$dateClicked"
      }
    }
  }
]

最佳答案

$cond$ifNull运算符是这里的 helper :

[
  {
    "$group": {
      "_id": {
        "$dayOfMonth": "$dateCreated"
      },
      "total": {
        "$sum": 1
      },
      "sent": {
        "$sum": { "$cond": [ { "$ifNull": [ "$dateSent", false ] }, 1, 0 ] }
      },
      "attempted": {
        "$sum": { "$cond": [ { "$ifNull": [ "$dateAttempted", false ] }, 1, 0 ] }
      },
      "viewed": {
        "$sum": { "$cond": [ { "$ifNull": [ "$dateViewed", false ] }, 1, 0 ] }
      },
      "clicked": {
        "$sum": { "$cond": [ { "$ifNull": [ "$dateClicked", false ] }, 1, 0 ] }
      }
    }
  }
]

$ifNull 将返回存在的字段(逻辑 true)或替代值 false$cond 查看此条件并返回 1 where true0 where false 以提供条件数数。

关于mongodb - 当前字段的聚合条件计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33143156/

相关文章:

node.js - 使用 mongoose 计算嵌套数组

mongodb - 匹配数组中的多个值

javascript - 如何在跳过(分页)之前计算聚合的长度

mongodb - 带有地理位置的Elasticsearch

mongodb - future 整个应用程序中是否可以使用基于文档的数据库来代替 RDBMS?

node.js - 将文档数组显示为以 id 为键的对象

mongodb - 通过 mod(ObjectId) 选择文档的一部分

javascript - 使用 Meteor.js 的集合平均函数

node.js - 当关键字列表为空时如何返回所有文档

mongodb - 如何根据条件 $push 一个字段?