MongoDB(Ruby驱动)查询指定键存在的文档及错误排查
解决MongoDB Ruby驱动查询
products.car存在性的错误问题 嘿,你的问题根源其实很简单——你误用了未定义的全局变量$exists!在Ruby里,没初始化的全局变量默认是nil,所以你的查询条件被转换成了{"products.car"=>{nil=>true}},而BSON文档不允许nil作为键,这就直接触发了BSON::InvalidKey错误。
下面给你两种场景下的正确写法:
一、Ruby原生MongoDB驱动的正确查询
你需要把MongoDB的操作符$exists写成字符串或者Ruby符号,让驱动能正确识别:
写法1:使用字符串形式的操作符
# 正确构建查询条件 x = client[:materials].find({"products.car" => {"$exists" => true}}) # 现在count能正常执行了 x.count
写法2:使用符号形式的操作符(更符合Ruby编码风格)
x = client[:materials].find({"products.car" => {:$exists => true}}) x.count
二、Mongoid ORM的实现方式
如果项目用了Mongoid,写法会更简洁直观,这里提供两种常用方式:
方式1:利用Mongoid的exists查询语法
假设你的模型类是Material,可以这样写:
# 字符串路径写法 Material.where("products.car".exists => true).count # 符号路径写法(更推荐) Material.where(:"products.car".exists => true).count
方式2:直接使用哈希条件
和原生驱动的写法类似,直接传递正确的BSON条件:
Material.where({"products.car" => {:$exists => true}}).count
小技巧:验证查询条件是否正确
如果你不确定自己写的查询条件对不对,可以先打印出来检查:
query = {"products.car" => {:$exists => true}} puts query.inspect # 正确的输出应该是:{"products.car"=>{:$exists=>true}} # 而不是包含nil的错误版本
内容的提问来源于stack exchange,提问作者Martin
相关产品推荐
相关产品推荐

