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

a11xaf1n  于 9个月前  发布在  Go
关注(0)|答案(1)|浏览(113)

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

const query = {
    createdAt: {"$gte": new Date("2023-11-01"), "$lte": new Date("2023-11-30")},
  }

const result = await Entity.countDocuments(query)

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

const query = {
    tags: {"$nin":["false-positive", "out-of-scope"]},
  }

const result = await Entity.countDocuments(query)


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

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


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

const colletion = mongooseConnection.collection("colecctionName")

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#

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

import * as dateFns from 'date-fns';

class Helper {

  public static generateDateRange(obj, dbType = 'NoSQL') {
    try {
      const dateRange: any = JSON.parse(obj);
      if (dateRange && dateRange.startDate && dateRange.endDate) {
        const startDate = dateFns.startOfDay(dateFns.parseISO(dateRange.startDate));
        const endDate = dateFns.endOfDay(dateFns.parseISO(dateRange.endDate));
        return dbType === 'NoSQL' ? { $lte: startDate, $gte: endDate } : Between(startDate, endDate);
      }
      return Helper.generateSingleDateRange(dateRange.startDate || dateRange.endDate || new Date(), dbType);
    } catch (e) {
      throw Helper.generateSingleDateRange(obj, dbType);
    }
  }
  
  public static generateSingleDateRange(date, dbType = 'NoSQL') {
    const startDate = dateFns.startOfDay(dateFns.parseISO(date));
    const endDate = dateFns.endOfDay(dateFns.parseISO(date));
    return dbType === 'NoSQL' ? { $lte: startDate, $gte: endDate } : Between(startDate, endDate);
  }
}

const startDate = new Date('2023-01-01'); // Replace with your start date
const endDate = new Date('2023-12-31'); // Replace with your end date
const query = { createdAt: Helper.generateDateRange({ startDate, endDate })}

const result = await Entity.countDocuments(query)

字符串

相关问题