我是Mongodb和rails的新手,我希望有人可以帮助我。
我想在Mongoid中运行等效的mongo .js查询:
db.getCollection('users').find({interest_ids: { $in: [ObjectId("string")]}}).sort({rank: -1}).limit(100)
到目前为止,我已经在ruby中这样做了:
users = User.in(interest_ids: ["string"]).order_by(:rank => 'desc').limit(100)
这很有效,但速度很慢。在我稍后用
解决它之前,它实际上并没有进行“in”检查users.to_json或类似的东西。
如果我直接在mongo shell中运行查询,它会立即生成我想要的内容。
非常感谢任何帮助!
答案 0 :(得分:0)
"string"
和ObjectId("string")
在MongoDB shell中不是一回事。使用Mongoid时,"string"
和BSON::ObjectId.from_string("string")
不是一回事。因此,与您的JavaScript相同的Mongoid查询将是:
User.in(interest_ids: [BSON::ObjectId.from_string("string")])
.order_by(:rank => 'desc')
.limit(100)
或:
User.where(:interest_ids.in => [BSON::ObjectId.from_string("string")])
.order_by(:rank => 'desc')
.limit(100)
Mongoid查询不会访问数据库,直到您对它们执行强制执行的操作,这符合ActiveRecord的行为,因此应该是这样。如果要强制查询加载文档,请说出:
User.where(:interest_ids.in => [BSON::ObjectId.from_string("string")])
.order_by(:rank => 'desc')
.limit(100)
.to_a # <-------------------
你也可以说.entries
或者用.each
等开始迭代结果。
您的字段的复数名称interest_ids
表示它实际上是BSON::ObjectId
的数组,而不是单个BSON::ObjectId
。如果是这种情况,那么您的MongoDB查询应该是:
db.getCollection('users').find({ interest_ids: ObjectId("string") }).sort({rank: -1}).limit(100)
和Mongoid版本将是:
User.where(:interest_ids => BSON::ObjectId.from_string("string"))
.order_by(:rank => 'desc')
.limit(100)
MongoDB将自行查看数组字段,{ array_field: scalar_value }
将找到array_field
中任何元素与scalar_value
匹配的所有文档。