如何将这个原始的mongodb javascript查询翻译成rails mongoid?

时间:2016-07-22 23:22:42

标签: ruby-on-rails mongodb mongoid

我是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中运行查询,它会立即生成我想要的内容。

非常感谢任何帮助!

1 个答案:

答案 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匹配的所有文档。