在 Mongoid 中检索 id 数组
Posted
技术标签:
【中文标题】在 Mongoid 中检索 id 数组【英文标题】:Retrieving array of ids in Mongoid 【发布时间】:2011-05-22 03:56:18 【问题描述】:如何在Mongoid
中检索IDs
的数组?
arr=["id1","id2"]
User.where(:id=>arr)
如果您正在检索另一个属性,您可以轻松地做到这一点
User.where(:nickname.in=>["kk","ll"])
但我想知道如何在 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)
以上是关于在 Mongoid 中检索 id 数组的主要内容,如果未能解决你的问题,请参考以下文章
删除 MongoID 文档中数组的最后一个元素 - Rails
如果其中一个字段存在于 mongoid 的另一个模型中,则获取对象数组