首页 > 解决方案 > 如何合并和汇总来自 MongoDB 的结果

问题描述

我有不同日期的数据切片,例如:

[{
    "_id" : ObjectId("5de4103552f7535d31c2e3e1"),
    "attributedUnitsOrdered14d" : 0,
    "clicks" : 1,
    "targetId" : NumberLong(209434056899554),
    "campaignId" : NumberLong(106574821410524),
    "query" : "miami hurricanes t shirt",
    "targetingType" : "TARGETING_EXPRESSION_PREDEFINED",
    "campaignName" : "Miami Hurricanes - Sponsored Products - Auto",
    "targetingExpression" : "close-match",
    "adGroupId" : NumberLong(141291184479487),
    "targetingText" : "close-match",
    "date" : ISODate("2019-10-07T00:00:00.000Z"),
    "__v" : 0
},
{
    "_id" : ObjectId("5de4104b52f7535d31c2e3e7"),
    "attributedUnitsOrdered14d" : 1,
    "clicks" : 1,
    "targetId" : NumberLong(209434056899554),
    "campaignId" : NumberLong(106574821410524),
    "query" : "miami hurricanes t shirt",
    "targetingType" : "TARGETING_EXPRESSION_PREDEFINED",
    "campaignName" : "Miami Hurricanes - Sponsored Products - Auto",
    "targetingExpression" : "close-match",
    "adGroupId" : NumberLong(141291184479487),
    "targetingText" : "close-match",
    "date" : ISODate("2019-10-08T00:00:00.000Z"),
    "__v" : 0
},
{
    "_id" : ObjectId("5de4105952f7535d31c2e3eb"),
    "attributedUnitsOrdered14d" : 1,
    "clicks" : 1,
    "targetId" : NumberLong(209434056899554),
    "campaignId" : NumberLong(106574821410524),
    "query" : "miami hurricanes t shirt",
    "targetingType" : "TARGETING_EXPRESSION_PREDEFINED",
    "campaignName" : "Miami Hurricanes - Sponsored Products - Auto",
    "targetingExpression" : "close-match",
    "adGroupId" : NumberLong(141291184479487),
    "targetingText" : "close-match",
    "date" : ISODate("2019-10-09T00:00:00.000Z"),
    "__v" : 0
}]

这些是针对一个广告系列的相同报告,但针对不同的日期。我想获得字段的总和clicks& attributedUnitsOrdered14d& 将其作为单个对象返回,如下所示:

{
    "_id" : ...,
    "attributedUnitsOrdered14d" : 2, // Sum of all the 3 objects
    "clicks" : 3, // Sum of all the 3 objects
    "targetId" : NumberLong(209434056899554),
    "campaignId" : NumberLong(106574821410524),
    "query" : "miami hurricanes t shirt",
    "targetingType" : "TARGETING_EXPRESSION_PREDEFINED",
    "campaignName" : "Miami Hurricanes - Sponsored Products - Auto",
    "targetingExpression" : "close-match",
    "adGroupId" : NumberLong(141291184479487),
    "targetingText" : "close-match",
    "date" : ISODate("2019-10-07T00:00:00.000Z"),
}

我可以使用中间件(用于查询的预挂钩find)或类似的东西吗?

标签: javascriptnode.jsmongodbmongoosemongodb-query

解决方案


似乎一个简单的$group就足够了:

db.collection.aggregate([
    {
        $group: {
            _id: null, //decide on different grouping id if needed.
            attributedUnitsOrdered14d: {$sum: "$attributedUnitsOrdered14d"},
            clicks: {$sum: "$clicks"},
            date: {$last: "$date"}, //assuming data is sorted, if not add $sort before $group
            targetId: {$first: "$targetId"},
            campaignId: {$first: "$campaignId"},
            query: {$first: "$query"},
            targetingType: {$first: "$targetingType"},
            campaignName: {$first: "$campaignName"},
            targetingExpression: {$first: "$targetingExpression"},
            adGroupId: {$first: "$adGroupId"},
            targetingText: {$first: "$targetingText"},
        }
    }
])

推荐阅读