"string" 和 ObjectId("string") 在 MongoDB shell 中不是同一个东西。 "string" 和 BSON::ObjectId.from_string("string") 在使用 Mongoid 时不是一回事。因此,与您的 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 匹配的所有文档。