mongodb - MongoDB 创建空结果对象
问题描述
我的数据库 Mongo 中有一个这样的集合:
/*Order:*/
{
date_order: ISODate("2020-08-02T22:00:00.000Z"),
item: 'banana'
price: '2$'
}
这是我的代码 Mongo,用于获取从 27/07(星期一)到 02/08(星期日)一周内每天的总订单:
db.getCollection('order').aggregate([
{$match: { date_order: {$gte: new Date('2020-07-27T22:00:00Z') , $lt: ISODate("2020-08-02T23:59:59Z")}}},
{$group: {
_id: {$dayOfWeek: '$date_order'},
nbOfOrders: {$sum: 1}
}},
{ $project: {
'_id': 0,
'dayOfWeek': { $subtract: ['$_id', 1] },
'nbOfOrders': '$nbOfOrders'
}
}
])
它给了我结果:
/* 1 */
{
"dayOfWeek" : 0.0, // 0 for MONDAY
"nbOfOrders" : 4.0
}
/* 2 */
{
"dayOfWeek" : 4.0, // 4 for FRIDAY
"nbOfOrders" : 4.0
}
除周一和周五外,其他所有日子都没有人订购任何东西。没有订单的日子应该怎么记录?我想要这样的结果:
/* MONDAY */
{
"dayOfWeek" : 0.0,
"nbOfOrders" : 4.0
}
/* TUESDAY */
{
"dayOfWeek" : 1.0,
"nbOfOrders" : 0.0
}
/* WEDNESDAY */
{
"dayOfWeek" : 2.0,
"nbOfOrders" : 0.0
}
/* THURSDAY */
{
"dayOfWeek" : 3.0,
"nbOfOrders" : 0.0
}
/* FRIDAY */
{
"dayOfWeek" : 4.0,
"nbOfOrders" : 4.0
}
/* SATURDAY */
{
"dayOfWeek" : 5.0,
"nbOfOrders" : 0.0
}
/* SUNDAY */
{
"dayOfWeek" : 6.0,
"nbOfOrders" : 0.0
}
解决方案
您需要将预定义的空值数组存储在变量中,
let dayOfWeek = [
{"dayOfWeek": 0, "nbOfOrders": 0},
{"dayOfWeek": 1, "nbOfOrders": 0},
{"dayOfWeek": 2, "nbOfOrders": 0},
{"dayOfWeek": 3, "nbOfOrders": 0},
{"dayOfWeek": 4, "nbOfOrders": 0},
{"dayOfWeek": 5, "nbOfOrders": 0},
{"dayOfWeek": 6, "nbOfOrders": 0} ]
聚合查询:Playground ,
db.collection.aggregate([
{
$match: {
date_order: {
$gte: ISODate("2020-07-27T22:00:00Z"),
$lt: ISODate("2020-08-10T23:59:59Z")
}
}
},
{
$group: {
_id: { $dayOfWeek: "$date_order" },
nbOfOrders: { $sum: 1 }
}
},
{
$project: {
_id: 0,
dayOfWeek: {
$subtract: ["$_id", 1]
},
nbOfOrders: "$nbOfOrders"
}
},
{
$group: {
_id: null,
items: { $push: "$$ROOT" }
}
},
{
$addFields: {
items: {
"$concatArrays": ["$items", dayOfWeek]
}
}
},
{ $unwind: "$items" },
{
$group: {
_id: "$items.dayOfWeek",
nbOfOrders: { $sum: "$items.nbOfOrders" }
}
},
{
$project: {
_id: 0,
dayOfWeek: "$_id",
nbOfOrders: "$nbOfOrders"
}
}
])
注意:当您使用聚合查询时,这是一个非常漫长的过程,并且会降低查询的性能,我说的是特别需要的结果,
我的建议是使用循环在查询之外进行,因为一周中只有可数的 7 天,并且循环比这个查询快,
我没有在这里添加循环示例,因为我不确定您使用的是哪种语言。
推荐阅读
- python - 构建一个函数来滚动 `f` 提供的骰子列表,并计算结果中最大数字为 `x_max` 的概率
- node.js - 在关闭窗口之前调用 REST API (React)
- python - 如何在 Python Scrapy http 请求上设置 cookie?
- javascript - Angular - 冻结第一个选项卡,直到另一个选项卡完全加载
- sql - SQL 条件行号重置
- python - 如何修复“ValueError:没有足够的值来解包(预期 2,得到 1)”
- ios - 是否可以在不使用第三方解决方案的情况下创建在 iOS 应用安装后仍然存在的深层链接?
- python - TensorFlow 中 model.predict 的进展?
- php - 如何使用 Laravel 在 MySQL 中插入表情符号?
- reactjs - 如何在 reactjs 中处理刷新令牌