我有一个订单模型,我想获取上个月到当前日期创建的所有订单。类似于接收2021年5月1日至2021年6月1日的所有订单。
我的数据库模式有{timestamps: true}
选项,它添加了createdAt
和updatedAt
字段。
Order.js
const OrderSchema = new mongoose.Schema(
{
billingAddress: { type: Object, required: true },
deliveryAddress: { type: Object, required: true },
user: {
type: mongoose.Schema.Types.ObjectId,
ref: "User",
},
seller: {
type: mongoose.Schema.Types.ObjectId,
ref: "Shop",
},
Product: {
product: { type: mongoose.Schema.Types.ObjectId, ref: "Product" },
color: String,
quantity: Number,
},
invoiceId: { type: String, required: true },
paymentIntentId: { type: String, required: true },
totalAmount: { type: Number, required: true },
groupId: { type: String, required: true },
status: {
type: String,
enum: [
"waitingConfirmation",
"confirmed",
"cancelRequest",
"cancelled",
"packing",
"shipped",
"delivered",
],
default: "waitingConfirmation",
},
note: String,
},
{ timestamps: true }
);
当我这样做来获取上个月的数据时,它起到了的作用
const lastMonthOrders = await Order.find({
$and: [
{ seller: req.shop.id },
{
createdAt: {
$gte: new Date(2021, 4, 1),
$lt: new Date(2021, 5, 1),
},
},
],
});
但我希望我的约会是动态的,所以我尝试了这个
let today = new Date();
let lastMonth = new Date(
today.setMonth(today.getMonth() - 1) - 60 * 60 * 1000
);
const lastMonthOrders = await Order.find({
$and: [
{ seller: req.shop.id },
{
createdAt: {
$gte: lastMonth,
$lt: today,
},
},
],
});
我的模型中的时间戳是这样的,它们的数据类型是Date:
createdAt: 2021-06-02T10:20:26.984+00:00,
updatedAt: 2021-06-02T10:21:28.432+00:00
上面的代码不起作用。它返回一个空对象。如何从特定的时间范围获取数据?
setMonth方法实际上修改日期,这意味着today
现在与lastMonth
的月份相同,两个变量之间只有一个小时的间隔。
尝试使用下面的代码,尽管它有点奇怪:
const lastMonth = new Date();
lastMonth.setMonth(lastMonth.getMonth() - 1);
const today = new Date(new Date() - 60*60*1000);
我推荐moment.js库:
const lastMonthOrders = await Order.find({
$and: [
{ seller: req.shop.id },
{
createdAt: {
$gte: moment().subtract(1, 'month').startOf('month').toDate(),
$lt: moment().startOf('day').toDate(),
// or $lte: moment().subtract(1, 'day').endOf('day').toDate(),
},
},
],
});