如何在猫鼬中查询日期

How to query date between in Mongoose

提问人:Raymond 提问时间:9/15/2023 最后编辑:Yong ShunRaymond 更新时间:9/15/2023 访问量:36

问:

我的 Mongo 数据库中有一组记录。

2023-09-12T00:10:17.558+00:00
2023-09-12T00:10:45.515+00:00
2023-09-12T00:10:49.121+00:00
2023-09-12T00:12:59.252+00:00
2023-09-12T23:23:45.238+00:00
2023-09-12T23:23:46.170+00:00
2023-09-12T23:34:43.082+00:00
2023-09-13T06:40:37.457+00:00

我正在使用 Mongoose find 查询它

const findActivityLogsByFilter = async (filter: TEmployeeFilter, currentUser: IEmployeeAttributes) => {
  try {
    console.log(filter.startDate, filter.endDate);
    return await employee_activity_logsModel
      .find({
        employeeId: filter.employeeId,
        activity: { $in: filter.actions },
        logDate: { $gte: filter.startDate, $lte: filter.endDate },
        _discontinuedUser: null,
      })
      .sort({ _id: 'desc' })
      .exec();
  } catch (error) {
    throw new InternalServerError(messages.generalMessage.Error);
  }
};

如果我将 和 单独留在过滤器中,则会显示所有记录。但是当我放过滤器时。没有结果显示employeeIdactivitylogDate

我尝试了不同的日期格式,例如

fromDate: 2023-09-12, toDate: 2023-09-12
fromDate: Tue Sep 12 2023 16:04:46 GMT+0800 (Taipei Standard Time),
toDate: Tue Sep 12 2023 16:04:46 GMT+0800 (Taipei Standard Time)

甚至用于格式化要在 和 日期过滤器上使用的日期,但没有显示任何结果。momentfromto

我也尝试直接在 MongoDB Compass 上查询它,但没有运气。

{
  employeeId:ObjectId('64f9731b4f8f4f269a44e7af'), 
  logDate:{
    $gte:ISODate('2023-09-12'),
    $lte:ISODate('2023-09-12')
  }
}

我是否需要使用日期格式来查询日期,而不考虑时间?我期望的是获取日期为 2023-09-12 的所有记录,因为我的查询是 .fromDate: 2023-09-12, toDate: 2023-09-12

JavaScript 节点.js mongodb 猫鼬 日期范围

评论

0赞 Robin Thomas 9/15/2023
是mongodb中的类型吗?你能验证一下吗?logDateDate
0赞 Raymond 9/15/2023
嗨,罗宾,是的。这是我的架构const EmployeeActivityLogsSchema = new Schema({ sessionId: { type: Schema.Types.ObjectId, required: true, default: mongoose.Types.ObjectId, }, employeeId: { type: Schema.Types.ObjectId, required: true, ref: 'Employee', }, activity: { type: String, enum: Object.values(constants.activityActions), required: true }, logDate: { type: Date, default: Date.now, required: true }, }).add(BaseSchema);

答:

2赞 Yong Shun 9/15/2023 #1

当您使用带有查询的日期和查询筛选文档时:startDate: new Date("2023-09-12")endDate: new Date("2023-09-12")

logDate: { $gte: startDate, $lte: endDate }

该查询将筛选“2023-09-12T00:00:00Z”到“2023-09-12T00:00:00Z”的文档。这只会将文档与 匹配。logDatelogDate: "2023-09-12T00:00:00Z"

您应该将 1 天添加到 并使用 :endDate$lt

filter.endDate.setDate(filter.endDate.getDate() + 1);
logDate: { $gte: filter.startDate, $lt: filter.endDate }

因此,查询结果将变为

logDate: { $gte: new Date("2023-09-12"), $lt: new Date("2023-09-13") }

获取文件 在“2023-09-12”上。logDate

评论

0赞 Raymond 9/15/2023
嗨,勇。如果成功,将尝试您的解决方案并在评论中更新
0赞 Yong Shun 9/15/2023
演示 @ Mongo Playground
0赞 Raymond 9/15/2023
伟大!它按预期工作。我的错,我没有检查格式化的时间new Date("2023-09-12")
0赞 user20042973 9/15/2023
既然这个答案解决了你的问题,你应该接受并投票
0赞 Raymond 9/16/2023
是的,我已经投了赞成票,并接受了它作为我问题的解决方案:)