node.js - 如何在 NodeJS 的查询参数中传递时间戳(Express + Mongoose)
问题描述
我有这样的 MongoDB 命令:
db.transaction.aggregate([
{
"$match":
{
$and:[{
'is_deleted': false,
'createdAt':{'$gte': ISODate('2020-09-01T00:00:00.000Z'),'$lte':ISODate('2020-12-15T00:00:00.000Z')},
'type': 'deposit'
}
]
}
},
{
$group: {
_id: null ,
depositRevenue: {$sum: "$amount"}
}
}
]).pretty();
和这样的输出:
{
"_id" : null,
"depositRevenue" : 324
}
查询很好,但是当我传入 NodeJS 时它不起作用。Bellow 是我在 ExpressJS 和 Mongoose 中的代码。
let revenueData = await Transaction.aggregate([
{
$match: {
$and: [{objFind}]
}
},
{
$group: {
_id: null,
totalRevenue: {$sum: "$amount"}
}
}
]);
像objFind
这样:
var startDate = new Date(req.query.startDate).toISOString();
var endDate = new Date(req.query.endDate).toISOString();
var objFind = {};
objFind["is_deleted"] = false;
if(startDate != undefined || endDate != undefined){
objFind["createdAt"] = {};
if(startDate != undefined){
objFind["createdAt"]["$gte"] = startDate;
}
if(endDate != undefined){
objFind["createdAt"]["$lte"] = endDate;
}
}
objFind['type'] = 'deposit';
请看一下。谢谢
解决方案
你需要简化你的代码,
- 创建具有所需条件的对象
var objFind = {
is_deleted: false,
type: 'deposit'
};
- 检查可用的开始日期和结束日期
if (req.query.startDate || req.query.endDate) {
objFind.createdAt = {};
if (req.query.startDate) objFind.createdAt.$gte = new Date(req.query.startDate);
if (req.query.endDate) objFind.createdAt.$lte = new Date(req.query.endDate);
}
- 默认情况下,根字段条件是和条件,所以不需要使用
$and
let revenueData = await Transaction.aggregate([
{ $match: objFind },
{
$group: {
_id: null,
totalRevenue: { $sum: "$amount" }
}
}
]);
推荐阅读
- android - 是否创建了多个 FirebaseMessagingService 实例来处理多个消息?
- php - 调用其他地方没有的变量
- node.js - Node.js 活动句柄突然上升
- java - 无论活动的生命周期如何,如何确保完成更新 firebase 数据库的过程
- html - 教程我遵循左“#”代替按钮中的链接。如果我想在实际服务器上托管它,我该如何解决?
- c# - .NET 4 中需要 MethodImpl(32) 吗?
- python - Pybind11:使用 for 循环使用 OpenMP 访问 python 对象
- android - Android 深度链接和启动模式
- javascript - jQuery 提取令牌并将其传递给 php 位置标头
- jquery - 当 ajax 正在处理并且请求尚未完成时,如何显示另一个 DIV?