$gte和$lte不能与node.js/mongoose一起使用

a11xaf1n  于 2024-01-08  发布在  Go
关注(0)|答案(1)|浏览(183)

我只是想计算一些文档。当使用其他参数,如“type”:“someType”,我得到正确的计数。但当我使用{"createdAt": {"$gte": "", "$lte": ""}}(与实际日期是JS日期对象)我得到0作为计数。一直在这几天,我似乎找不到解决方案...
我试着把范围缩小到尽可能小的可复制范围。像这样:

  1. const query = {
  2. createdAt: {"$gte": new Date("2023-11-01"), "$lte": new Date("2023-11-30")},
  3. }
  4. const result = await Entity.countDocuments(query)

字符串
这将返回0,即使我100%知道我有文档匹配标准,例如“createdAt”:'2023-11- 06 T08:09:07.000Z'。
使用其他参数尝试相同的countDocuments()函数返回正确的数字,例如:

  1. const query = {
  2. tags: {"$nin":["false-positive", "out-of-scope"]},
  3. }
  4. const result = await Entity.countDocuments(query)


上面的代码将返回正确数量的文档,这些文档在其“tages”字段中没有这两个字符串。
我也试过使用“$and”操作符,如下所示:

  1. const testQuery = {
  2. $and: [{ createdAt: { $gte: new Date("2023-10-01") } }, { createdAt: { $lte: new Date("2023-11-31") } }],
  3. }


但没有运气。
我还尝试了使用操作符注销查询,并将其粘贴到MongoExpress的“Advanced”-tab中。这将返回正确的文档,因此问题似乎与Mongoose或Node.js有关。
我不知道为什么它不工作与“$gte”和“$lte”,请帮助。
编辑:我发现了一个变通方法,但它不应该是必需的。为了使它工作,我必须对集合本身执行完全相同的查询,而不是使用DB模型“Entity”:

  1. const colletion = mongooseConnection.collection("colecctionName")
  2. const result = await colletion.countDocuments({ createdAt: { $gte: "2023-10-01", $lte: "2023-11-31" } })


这给了我正确的计数,但我不明白为什么它不应该与DB模型本身一起工作。
编辑2:通过使用new Date().toISOString().split("T")[0]使它工作得足够好,所以我们只得到YYYY-MM-DD格式。这沿着直接查询集合,而不是使用DB模型,允许我在日期之间提取数据。
尽管如此,问题仍然存在。Mongoose应该处理JS日期对象,并且似乎过于有限,我们不能指定日期超过一天。

qf9go6mv

qf9go6mv1#

你可以用这个方法,我是这样处理的

  1. import * as dateFns from 'date-fns';
  2. class Helper {
  3. public static generateDateRange(obj, dbType = 'NoSQL') {
  4. try {
  5. const dateRange: any = JSON.parse(obj);
  6. if (dateRange && dateRange.startDate && dateRange.endDate) {
  7. const startDate = dateFns.startOfDay(dateFns.parseISO(dateRange.startDate));
  8. const endDate = dateFns.endOfDay(dateFns.parseISO(dateRange.endDate));
  9. return dbType === 'NoSQL' ? { $lte: startDate, $gte: endDate } : Between(startDate, endDate);
  10. }
  11. return Helper.generateSingleDateRange(dateRange.startDate || dateRange.endDate || new Date(), dbType);
  12. } catch (e) {
  13. throw Helper.generateSingleDateRange(obj, dbType);
  14. }
  15. }
  16. public static generateSingleDateRange(date, dbType = 'NoSQL') {
  17. const startDate = dateFns.startOfDay(dateFns.parseISO(date));
  18. const endDate = dateFns.endOfDay(dateFns.parseISO(date));
  19. return dbType === 'NoSQL' ? { $lte: startDate, $gte: endDate } : Between(startDate, endDate);
  20. }
  21. }
  22. const startDate = new Date('2023-01-01'); // Replace with your start date
  23. const endDate = new Date('2023-12-31'); // Replace with your end date
  24. const query = { createdAt: Helper.generateDateRange({ startDate, endDate })}
  25. const result = await Entity.countDocuments(query)

字符串

展开查看全部

相关问题