基于节点mongoDB中的开始和结束日期过滤器过滤数据

vs3odd8k  于 2023-06-29  发布在  Go
关注(0)|答案(2)|浏览(111)

我在MongoDB数据库中有一个集合,其中包含一些数据,并希望根据从日期到日期过滤和查找数据。
样本数据

{
  "_id": "64958e4cd25792d403c05e83",
  "dealId": "4981506000014538111",
  "note": "short description 1123",
  "dateTime": "09/24/2022 12:22 AM",
  "nextId": null,
  "__v": 0
},
{
  "_id":"64958e4cd25792d403c05e86",
  "dealId": "4981506000014538111",
  "note": "big description",
  "dateTime": "06/23/2023 05:51 PM",
  "nextId": null
  "__v": 0
}

我使用下面的命令来获取数据,包括从日期到日期,但它没有给予我任何结果。startTime和endTime都是EST格式。不知道我错过了什么。请指导

const query = {
    $and: [
        { 
            dealId: dealId 
        },
        { 
            nextId: null 
        }
    ]
}; 
if (from && until) {
    query.$and.push({
        dateTime: {
            $gte: "06/23/2023",
            $lte: "09/24/2022"
        }
    })
}
const notes = await NotesModel.find(query);
kgsdhlau

kgsdhlau1#

正如在注解中已经指出的,当以本地格式存储为字符串时,您不能比较日期值。MongoDB本身不支持12小时时间,我建议使用第三方Date库,例如。moment.js、Luxon或Day.js,并将字符串转换为正确的Date值。下面是一个使用Luxon的例子:

const { DateTime } = require("luxon");
db.NotesModel.find({ dateTime: { $type: "string" } }).toArray().forEach( doc => {
   let ts = DateTime.fromFormat(doc.dateTime, "MM/dd/yyyy hh:mm a").toJSDate();
   db.NotesModel.updateOne({ _id: doc._id }, { $set: { dateTime: ts } })
})

根据数据大小,此更新可能需要一些时间。
注意,DateTime是在当前时区解析的,您可能需要显式设置适用的时区。
然后你可以运行你的查询:

db.NotesModel.find({
   dateTime: {
      $gte: ISODate("2023-06-23"),
      $lte: ISODate("2022-09-24")
   }
})

但是,这个特定的查询永远不会返回任何内容,因为日期不能晚于2023-06-23,也不能早于2022-09-24。

falq053o

falq053o2#

你不应该在字符串中使用日期。如果您想查询上周的情况:

const currentDate= new Date()

from = new Date(currentDate.getFullYear(),
    currentDate.getMonth(),
    currentDate.getDate() + (7 - currentDate.getDay())

if (from && until) {
    query.$and.push({
        dateTime: {
            $gte: from,
            $lte: currentDate
        }
    })
}

相关问题