每月mongodb的所有天总数

问题描述 投票:0回答:1

嘿,我需要按天获取所有totalPrice组的总和

我得到这个结果

enter image description here

但是我需要获取一个月的所有其余天,即使它返回0

我需要解决方案这是我的代码

Order.aggregate(
        [  
            {$project :{
                yearMonthDay: { $dateToString: { format: "%Y-%m-%d", date: "$created" } },
                totalPrice :  "$totalPrice"
            }},            

            {$group: {
                _id : {yearMonthDay : "$yearMonthDay"},
                 "count": { "$sum": 1 } ,
                "total": {"$sum": "$totalPrice"}
            }},
            {$sort: {_id: -1}},
            {$limit:4}
        ] 
mongodb mapreduce mongodb-query aggregation-framework aggregate
1个回答
0
投票

此查询应为您工作。

db.warehouse_inventory.aggregate([
{ $project: { yearMonthDay: { $dateToString: { format: "%Y-%m-%d", date: '$created' }}, totalPrice:"$totalPrice" }},
{ $group: { _id: "$yearMonthDay", count: { $sum: 1 }, total: {"$sum": "$totalPrice"} }},
{ $sort: { _id: -1 } },
{ $group: { _id: null, stats: { $push: "$$ROOT" }}, 
{
    $project: {
        results: {
            $map: {
                input: ["2020-05-16","2020-05-15","2020-05-14","2020-05-13","2020-05-12"],
                as: "date",
                in: {
                    $let: {
                        vars: {
                            dateIndex: {
                                "$indexOfArray": ["$stats._id", "$$date"]
                            }
                        },
                        in: {
                            $cond: {
                                if: { $ne: ["$$dateIndex", -1] },
                                then: { $arrayElemAt: ["$stats", "$$dateIndex"] },
                                else: { _id: "$$date", count: 0, total: 0 }
                            }
                        }
                    }
                }
            }
        }
    }
}, 
{ $unwind: "$results" },
{ $replaceRoot: { newRoot: "$results"}}
])

[前3个步骤与您的相同。

[{ $group: { _id: null, stats: { $push: "$$ROOT" }}会将前一阶段的结果推送到一个错误的stats中,我们将在以后的阶段中使用它进行查找。

在最后阶段,我们将创建可能的日期范围并对其进行迭代。范围内的每个键。

["$indexOfArray": ["$stats._id", "$$date"]将检查stats数组中是否存在日期

然后,我们将使用该索引从stats数组中获取值,否则将推送默认值。

由于这些结果仍在results下,我们将unwind该数组移到root

如果您的服务器版本高于3.6,我们也可以简化日期范围创建部分。让我们使用$range将输入数组初始化为天。

input:{ $range:[1,31] },
as: 'day'

并且修改dateIndex部分是这样的>>

dateIndex: {
   "$indexOfArray": ["$stats._id", {$dateToString:{ date:{$dateFromParts:{'year':2020, 'month':3, 'day':"$$day"}}, format:'%Y-%m-%d'}]
}

也同样更改默认值部分。

© www.soinside.com 2019 - 2024. All rights reserved.