【问题标题】:Mongoose query where with missing (or undefined) fieldsMongoose 查询缺少(或未定义)字段的位置
【发布时间】:2015-02-20 16:35:47
【问题描述】:

我有一个问题,我的 MongoDB 数据库有一个经过修改的 Mongoose 方案。

我希望能够使用where 命令进行查询,但如果该字段丢失或在任何找到的记录中出现undefined,则Mongoose 会返回错误。

例如:

  return this.find({personID: req.user._id})
  .where('rangeBefore').lt(time);

这会返回错误,因为某些记录没有rangeBefore

我想要实现的是过滤掉任何没有rangeBefore 字段的记录(即它没有通过where 测试)。

我尝试过像这样使用exists 前缀:

  return this.find({personID: req.user._id})
  .exists('rangeBefore').where('rangeBefore').lt(time);

但我仍然收到错误消息。

谁能建议一种方法来忽略带有undefined 字段的记录,而不是返回错误?

【问题讨论】:

  • 您收到的错误信息是什么?
  • 路径“rangeBefore”中值“未定义”的数字转换失败
  • 该错误消息通常意味着您的 time 变量是 undefined。像这样的查询自然会忽略不存在 rangeBefore 的文档。 time 的值是多少?
  • 你说的很对——问题出在“时间”上。这真是一种解脱——我想知道当特定记录中没有字段时猫鼬是否无法执行查询,但实际上它工作正常。

标签: node.js mongodb mongoose


【解决方案1】:

如果您只想修改现有查询:

return this.find({ personID: req.user._id, 
  rangeBefore: { $exists: true, $ne: null } //also check for nulls
})
.where('rangeBefore').lt(time);

或者,如果适合,您也可以使用回调方法:

this.find({personID: req.user._id, 
  rangeBefore: { $exists: true, $ne: null, $lt: time } 
})
.exec(function(err, record) { });

【讨论】:

  • 这是我问题的答案,但我找错了树。有问题的是 time 变量,而不是查询。不过,您的查询代码可以满足需要。从测试看来,如果字段不存在,$lt 查询会自动拒绝记录,因此这里不需要$exists
【解决方案2】:

你可以这样做,它返回一个承诺:

find({rangeBefore: { $exists: 1, $lt: time } }).exec()

或者使用回调:

find({rangeBefore: { $exists: 1, $lt: time } }).exec(function(err, record){

})

【讨论】:

    【解决方案3】:

    您的错误信息:

    路径“rangeBefore”中值“未定义”的数字转换失败

    表示您的time 变量是undefined。像这样的查询自然会忽略不存在 rangeBefore 的文档。

    所以问题在于您的 time 变量,而不是您的文档或查询。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-23
      • 2015-08-29
      • 2012-07-04
      • 2020-05-05
      • 2017-01-28
      • 1970-01-01
      • 2013-01-20
      • 2019-07-26
      相关资源
      最近更新 更多