【问题标题】:Mongoose Query for Boolean field布尔字段的猫鼬查询
【发布时间】:2019-06-06 01:19:56
【问题描述】:

要查询布尔字段,我必须使用“false”而不是 false。 我正在使用 Mongoose 和 Node JS。

Mongodb 架构定义:

var MySchema = new mongoose.Schema({
    isPrivate: { type: Boolean, default: false }
})
db.model('MyModel', MySchema);

查询:

MyModel.find({ isPrivate: false })

上面的查询不返回任何数据集,而下面的代码返回。

MyModel.find({ isPrivate: "false" })

请帮忙。

【问题讨论】:

  • 帮助具体是什么?您有一个可行的解决方案。
  • 是否应该将布尔值作为字符串进行比较?
  • 您能否通过在您的代码中添加mongoose.set('debug', true); 来启用调试并查看正在生成的查询?由于基于模式的转换,这两个 Mongoose 查询应该产生相同的本机查询。
  • 它们生成完全相同的本机查询。我通过向每个现有文档添加 isPrivate 字段解决了这个问题。我最近通过添加属性更改了我的架构并忘记更新文档。谢谢。

标签: node.js mongodb mongoose


【解决方案1】:

根据您的模型,您应该首先使用如下更新方法更新您的文档以将"false" 更改为false

MyModel.update({},{"$set":{"isPrivate":false}},{ multi: true })

如果你不习惯更新文档,那么你应该像这样使用$or or $in

MyModel.find({ $or:[ {'isPrivate':"false"}, {'isPrivate':false} ]})

MyModel.find({ "isPrivate": { "$in": ["false",false] } })

【讨论】:

  • 这是我的错误。我提到的那些查询会产生相同的结果。我通过向每个现有文档添加 isPrivate 字段解决了这个问题。我最近通过添加属性更改了我的架构并忘记更新文档。谢谢。
【解决方案2】:

如果您通过添加新路径来更新架构并使用此新架构创建新文档并存储在具有使用旧架构创建的旧文档的集合中,您将面临这个问题。在我的情况下,我将布尔路径 rated 与“默认”:false 添加到我的 jobs 集合中,该集合已经有没有此字段的文档。当我在下面进行查找查询时

Job.find({rated: false}, cb)

即使有带有rated: false 的作业,查询也返回了一个空游标。

我只是通过跳转到控制台并使用默认值false 更新所有带有字段rated 的作业文档来解决问题。之后我的查询返回了与数据库一致的游标。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-13
    • 1970-01-01
    • 2017-09-21
    • 2021-12-10
    • 2017-08-26
    • 1970-01-01
    • 1970-01-01
    • 2020-06-02
    相关资源
    最近更新 更多