Rails中使用Mongoid查询MongoDB数组匹配无结果问题求助
解决Mongoid查询返回空数组的问题
嘿,我之前也碰到过一模一样的问题,核心原因基本都是ID类型不匹配——你从MySQL拿到的是整数ID数组,但MongoDB里AdminInfo的id字段类型和它对不上,自然查不到结果。下面一步步帮你排查和解决:
1. 先确认MongoDB中AdminInfo的ID类型
先打开Rails控制台,执行这条命令看看文档的ID格式:
AdminInfo.first.inspect
重点看输出里的id字段:是类似BSON::ObjectId('60d21b4667d0d8992e610c85')的默认ObjectId类型,还是像1、4这样的整数?
2. 根据ID类型调整查询逻辑
情况1:Mongo中的ID是ObjectId类型
如果AdminInfo用的是Mongoid默认的ObjectId,那要么是你创建文档时没把MySQL的AdminItems整数ID和Mongo的ID对应上,要么是你把AdminItems的ID存成了字符串格式的ObjectId。如果确认两者ID是对应的,把整数数组转成字符串数组再查询就行:
# 把整数ID转成字符串类型 @info_strings = @info.map(&:to_s) @admininfo = AdminInfo.where(id: @info_strings).as_json
情况2:Mongo中的ID是整数类型
如果你在AdminInfo模型里自定义了整数类型的ID(比如设置了field :id, type: Integer),那可能是查询时的类型匹配细节问题。试试这两种方式:
# 显式确保ID为整数类型(虽然@info已经是整数,但可以再确认下) @admininfo = AdminInfo.where(id: @info.map(&:to_i)).as_json # 或者用遍历查询的方式,自动过滤掉不存在的ID结果 @admininfo = @info.map { |id| AdminInfo.find_by(id: id) }.compact.as_json
3. 再排查几个小细节
- 直接去MongoDB shell里验证:执行
db.admin_infos.find({id: 1})(把1换成@info里的某个ID),确认集合里确实有对应文档。 - 检查
AdminInfo模型的集合配置:比如有没有写错集合名称(比如store_in collection: 'admin_info'但实际集合是admin_infos)。
内容的提问来源于stack exchange,提问作者joe
相关产品推荐
相关产品推荐

