【问题标题】:Retrieving array of ids in Mongoid在 Mongoid 中检索 id 数组
【发布时间】:2011-05-22 03:56:18
【问题描述】:

如何在Mongoid 中检索IDs 的数组?

arr=["id1","id2"]
User.where(:id=>arr)

如果您正在检索另一个属性,您可以轻松地做到这一点

User.where(:nickname.in=>["kk","ll"])

但我想知道如何在 mongoid 中做到这一点 -> 这应该是一个非常简单和常见的操作

【问题讨论】:

    标签: ruby mongoid


    【解决方案1】:

    请记住,ID 存储为 :_id 而不是 :id 。有一个id helper 方法,但是当你做查询时,你应该使用:_id

    User.where(:_id.in => arr)
    

    我经常发现获取 id 列表来执行复杂查询很有用,所以我会这样做:

    user_ids = User.only(:_id).where(:foo => :bar).distinct(:_id)
    Post.where(:user_id.in => user_ids)
    

    【讨论】:

    • 当用户数量较少时,上述解决方案可以正常工作。但是当有成千上万的用户时,它需要大量的内存。
    • @dpaluy 你是对的——这种方法只是一种技巧。此外,数据可能会在第一次和第二次查询之间发生变化,尤其是当有很多文档时。谨慎使用,或者更好的是,找出更好的方法!
    • 更好的方法是使用.distinct(:_id) 而不是.map(&:_id)distinct 在执行查询期间工作,这比告诉 rails 循环数组要快一些
    【解决方案2】:
    user_ids = User.only(:_id).where(:foo => :bar).map(&:_id)
    Post.where(:user_id.in => user_ids)
    

    当用户数量较少时,上述解决方案可以正常工作。但是,当有成千上万的用户时,它将需要大量内存。

    User.only(:_id).where(:foo => :bar).map(&:_id)
    

    将在除 id 之外的每个字段中创建一个包含 nil 的用户对象列表。

    解决方案(对于 mongoid 2.5):

    User.collection.master.where(:foo => :bar).to_a.map {|o| o['_id']}
    

    【讨论】:

      【解决方案3】:

      或者简单地说:

      arr = ['id1', 'id2', 'id3']
      User.find(arr)
      

      【讨论】:

      • 上述问题:如果没有找到一个id,它将返回错误而不是找到的id。
      • Mongoid.raise_not_found_error = false 将避免上述查询中出现未找到文档的错误
      【解决方案4】:

      browsersenior 建议的上述方法似乎不再起作用,至少对我而言。我要做的是:

      User.criteria.id(arr)
      

      【讨论】:

      • 只是一个简短的说明。对于 Mongoid 2.0.0 及更高版本,您需要使用 for_ids 而不是 id,如下所示:User.criteria.for_ids(arr)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-18
      • 1970-01-01
      • 2018-03-20
      • 2021-01-17
      相关资源
      最近更新 更多