mongodb - 如何向 Mongo 聚合结果添加新字段?

标签 mongodb mongodb-query aggregation-framework

我有以下 mongodb 聚合查询,按日期分组(1-05-2017 到 1-13-2017)

CampaignActivity.aggregate([
        {
        "$match": {
            "$and":[{updatedAt: {$lt: new Date('1-13-2017')}},{updatedAt: {$gte: new Date('1-05-2017')}}]
        }
    },
    {
        "$project" :
        {
           _id : 0,
           "datePartDay" : {"$concat" : [
               {"$substr" : [{"$dayOfMonth" : "$updatedAt"}, 0, 2]}, "-",
               {"$substr" : [{"$month" : "$updatedAt"}, 0, 2]}, "-",
               {"$substr" : [{"$year" : "$updatedAt"}, 0, 4]}
          ] },
          "isdelivered": {"$cond": { if: { $eq: [ "$delivered", true ] }, then: 1, else: 0 }},
          "isclicked": {"$cond": { if: { $eq: [ "$clicked", true ] }, then: 1, else: 0 }},
          "isunsubscribe": {"$cond": { if: { $eq: [ "$unsubscribed", true ] }, then: 1, else: 0 }}

        }
    },

    { "$group" :
        { "_id" : "$datePartDay",
          "delivered" : { "$sum" :'$isdelivered' }, 
          "clicked" : { "$sum" :'$isclicked' }, 
          "unsubscribed" : { "$sum" :'$isunsubscribe' } 
        }
    }
    ],function (err, result) {
        if (err) {
            console.log(err);
        } else {
            console.log(result);
        }
    });

聚合结果:

 [
       {
         "_id": "12-1-2017",
         "delivered": 0,
         "clicked": 1,
         "unsubscribed": 1
       },
       {
         "_id": "11-1-2017",
         "delivered": 2,
         "clicked": 1,
         "unsubscribed": 0
       }
   ]
  • 是否可以添加新字段以导致集合中不存在诸如“日期”之类的内容?

  • 是否可以使用虚拟数据添加缺失的日期字段?

最佳答案

您的$project 阶段是多余的。您可以轻松地将所有逻辑移至 $group 阶段并以 $project 阶段结束以重新格式化您的响应。

像下面这样的东西。

[{
    "$match": {
        "$and": [{
            updatedAt: {
                $lt: new Date('1-13-2017')
            }
        }, {
            updatedAt: {
                $gte: new Date('1-05-2017')
            }
        }]
    }
}, {
    "$group": {
        "_id": {
            $dateToString: {
                format: "%m-%d-%Y",
                date: "$updatedAt"
            }
        },
        "delivered": {
            $sum: {
                "$cond": {
                    if: {
                        $eq: ["$delivered", true]
                    },
                    then: 1,
                    else: 0
                }
            }
        },
        "clicked": {
            $sum: {
                "$cond": {
                    if: {
                        $eq: ["$clicked", true]
                    },
                    then: 1,
                    else: 0
                }
            }
        },
        "unsubscribed": {
            $sum: {
                "$cond": {
                    if: {
                        $eq: ["$unsubscribed", true]
                    },
                    then: 1,
                    else: 0
                }
            }
        }
    }
}, {
    "$project": {
        "_id": 0,
        "date": "$_id",
        "delivered": 1,
        "clicked": 1,
        "unsubscribed": 1
    }
}]

关于mongodb - 如何向 Mongo 聚合结果添加新字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41592999/

相关文章:

javascript - Mongoose - 查找(): object inside search options is not working

mongodb - 将聚合操作合并到单个结果中

c# - MongoDB .NET 驱动程序 - 聚合组和计数

mongodb - $项目 : Is it possible to access a property of an expression result in just one single stage?

mongodb - 计算数组中相同值出现的次数

mongodb - 使用 MongoDB 的聚合框架移动平均值?

mongodb - 开始使用 MongoDB 进行解析迁移时出现“无法访问的服务器”错误

javascript - MongoDB计算不同的值(value)?

node.js - MongoDb 数据关系

mongodb - 哪种是存储图像的最佳方法?