在mongo中有效的查询在mongoose中不起作用

在mongo中有效的查询在mongoose中不起作用,mongoose,Mongoose,我在mongoose中进行以下查询: Schedule.find({ 'operative.from': { $lte: '2015-09-07T00:00:25+00:00' }, 'operative.to': { $gte: '2015-09-07T23:59:25+00:00' }, 'operative.weekdays': { $in: [ 1 ] } }) .exec() .then(function () { … }) 它不返回任何结果。

我在mongoose中进行以下查询:

Schedule.find({
    'operative.from': { $lte: '2015-09-07T00:00:25+00:00' },
    'operative.to': { $gte: '2015-09-07T23:59:25+00:00' },
    'operative.weekdays': { $in: [ 1 ] } })
    .exec()
    .then(function () { … })
它不返回任何结果。让我困惑的是,如果我在Mongo Shell上运行完全相同的查询,它会像预期的那样返回大约200个结果

我已经尝试删除这些条件,直到它返回一些结果,而mongoose混淆的是两个日期查询

这些字段的相关架构如下所示:

operative: {
   from: Date,
   to: Date,

   // weekdayds the flight is operated, Sunday = 0
   weekdays: []
 }

我还确保了不带日期条件的查询返回预期结果,它们确实返回了预期结果。你知道这可能是什么原因吗?

你正在向mongoose需要js日期对象的查询传递两个字符串。当您使用新日期'2015-08-12T00:00:25'时,它将起作用。

确定问题不在于查询本身,而在于模式:

在另一个与查询无关的字段中,我指定了一个路径,如下所示:

aircraft: {
  type: String,
  owner: String
}
使用保留密钥类型导致验证错误。出于性能原因,我跳过文档上的mongoose验证来填充集合,因此没有注意到这个问题

将airpair.type路径更改为type:{type:String}后,文档验证成功,查询正确完成

我还在Mongoose存储库中报告了一个事实,即验证错误可能会悄悄地使您的查询失败,这是不可接受的

编辑:


正如维护人员指出的,这是猫鼬的设计。使用来抛出相应的错误

您是否尝试过在日期周围添加新日期?这根本不是真的。Mongoose需要一个vlid日期对象或任何可以转换为有效日期对象的对象,如数组或ISO字符串。我有几个大型Mongoose应用程序正在生产中,它们都可以处理大量的日期查询,并且可以很好地处理查询日期。你试过了吗?我只是觉得做显式强制转换比依赖一些隐式代码更好…这两种方法都没有错。你的方法非常明确,但我的方法依赖于可靠的标准ISO-8601。这两种方法每次都会像预期的那样起作用,这不是我问题的根源,请参阅我自己的答案了解详细信息。另一方面,有趣的是,看看两者之间是否有任何性能差异,我想这取决于Mongoose如何处理查询