【问题标题】:How to translate this raw mongodb javascript query into rails mongoid?如何将此原始 mongodb javascript 查询转换为 rails mongoid?
【发布时间】:2016-07-22 23:22:41
【问题描述】:

我是 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 中运行查询,它是即时的并且有我想要的。

任何帮助将不胜感激!

【问题讨论】:

    标签: ruby-on-rails mongodb mongoid


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-23
      • 2013-07-31
      • 2021-09-11
      • 2019-07-19
      • 2017-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多