Mongoose查询缺少(或未定义)字段的位置

时间:2015-02-20 16:35:47

标签: node.js mongodb mongoose

我有一个问题,我有一个凌乱的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个字段的记录,而不是返回错误吗?

3 个答案:

答案 0 :(得分:12)

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

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) { });

答案 1 :(得分:3)

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

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

或使用回调:

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

})

答案 2 :(得分:1)

您的错误消息:

  

对于值而言,转换为数字失败"未定义"在路径" rangeBefore"

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

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