Mongoid 6.3中where in查询无法正常工作的问题咨询
你遇到的问题大概率不是语法错误(Mongoid 6中:role.in => ['admin', 'supervisor']的写法是完全合规的),而是以下几种常见情况之一:
1. 数据库中不存在role为admin的用户
先确认核心数据是否存在——在MongoDB Shell中执行以下命令:
# 统计role为admin的用户数量 db.users.find({role: 'admin'}).count()
如果结果为0,那User.where(:role.in => ['admin', 'supervisor']).count()返回0就完全合理,可能你误以为数据库中存在admin用户,但实际并没有。
2. 数据类型不匹配
检查你的User模型中role字段的类型定义,以及数据库中实际存储的类型:
比如模型中定义的是
Symbol类型:class User include Mongoid::Document field :role, type: Symbol end但数据库中
role存储的是字符串(比如'supervisor'),此时Mongoid会自动将查询条件中的字符串转为符号(比如:admin、:supervisor),如果数据库中没有符号类型的admin记录,就会返回0;而单个'supervisor'查询时,可能因为数据中同时存在符号和字符串类型的supervisor记录,导致能查到结果。解决方法:统一字段类型,要么修改模型定义为
String,要么批量将数据库中所有role字段转换为符号类型。
3. 大小写不匹配
MongoDB的查询是区分大小写的,如果数据库中admin用户的role值是'Admin'(首字母大写),而你查询用的是小写的'admin',就会完全匹配不到。
解决方法:查询时使用与数据库中一致的大小写,或者批量修改数据统一大小写格式。
4. 验证实际执行的查询语句
你可以在Rails控制台中打印Mongoid生成的原生MongoDB查询语句,确认是否符合预期:
# 输出查询的JSON格式语句 puts User.where(:role.in => ['admin', 'supervisor']).to_json
这会输出类似这样的内容:
{"query":{"role":{"$in":["admin","supervisor"]}},"fields":{},"options":{}}
把这个查询语句拿到MongoDB Shell中执行,看返回结果是否正确:
db.users.find({"role":{"$in":["admin","supervisor"]}}).count()
如果Shell中返回结果也是0,那问题肯定出在数据本身,而非Mongoid的语法逻辑。
内容的提问来源于stack exchange,提问作者rAzOr

