【问题标题】:Query that works in mongo does not work in mongoose在 mongo 中有效的查询在 mongoose 中无效
【发布时间】:2015-09-07 05:30:58
【问题描述】:

我在猫鼬中进行以下查询:

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 个结果。

我已经尝试删除条件,直到它返回一些结果,而让猫鼬感到困惑的是两个日期查询。

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

operative: {
   from: Date,
   to: Date,

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

我还确保不带日期条件的查询返回预期结果,而且确实如此。有什么想法可能导致这种情况吗?

【问题讨论】:

  • 您是否尝试过 new Date() 围绕您的日期?

标签: mongoose


【解决方案1】:

好的,问题不在于查询本身,而在于架构:

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

aircraft: {
  type: String,
  owner: String
}

使用保留键 type 导致验证错误。出于性能原因,我在文档上填充了跳过猫鼬验证的集合,因此没有注意到这个问题。

aircraft.type 路径更改为type: { type: String } 后,文档验证成功并且查询正确执行。

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

编辑:

正如维护者指出的,这是 Mongoose 的设计。使用strict option 抛出相应的错误

【讨论】:

    【解决方案2】:

    您将两个字符串传递给您的查询,其中 mongoose 需要 js Date 对象。当你使用new Date('2015-08-12T00:00:25')时它会起作用

    【讨论】:

    • 这根本不是真的。 Mongoose 期待一个 vlid Date 对象或任何可以转换为有效 Date 对象的对象,例如数组或 ISO 字符串。
    • 好吧,我在生产中有几个大型猫鼬应用程序,它们都处理大量的日期查询,并且它们与 Dates 查询配合得很好。你试过了吗?我只是认为最好进行显式转换然后依赖一些隐式代码......
    • 这两种方式都没有问题。您的方式非常明确,但我的方式依赖于可靠的标准(ISO-8601)。两者每次都会按预期工作(这不是我问题的根源,有关详细信息,请参阅我自己的答案)。另一方面,看看两者之间是否有任何性能差异会很有趣,我想这取决于 Mongoose 如何处理查询
    猜你喜欢
    • 2018-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-28
    • 1970-01-01
    • 1970-01-01
    • 2014-07-30
    • 2016-07-04
    相关资源
    最近更新 更多