【发布时间】:2011-05-22 03:56:18
【问题描述】:
如何在Mongoid 中检索IDs 的数组?
arr=["id1","id2"]
User.where(:id=>arr)
如果您正在检索另一个属性,您可以轻松地做到这一点
User.where(:nickname.in=>["kk","ll"])
但我想知道如何在 mongoid 中做到这一点 -> 这应该是一个非常简单和常见的操作
【问题讨论】:
如何在Mongoid 中检索IDs 的数组?
arr=["id1","id2"]
User.where(:id=>arr)
如果您正在检索另一个属性,您可以轻松地做到这一点
User.where(:nickname.in=>["kk","ll"])
但我想知道如何在 mongoid 中做到这一点 -> 这应该是一个非常简单和常见的操作
【问题讨论】:
请记住,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)
【讨论】:
.distinct(:_id) 而不是.map(&:_id)。 distinct 在执行查询期间工作,这比告诉 rails 循环数组要快一些
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']}
【讨论】:
或者简单地说:
arr = ['id1', 'id2', 'id3']
User.find(arr)
【讨论】:
Mongoid.raise_not_found_error = false 将避免上述查询中出现未找到文档的错误
browsersenior 建议的上述方法似乎不再起作用,至少对我而言。我要做的是:
User.criteria.id(arr)
【讨论】:
for_ids 而不是 id,如下所示:User.criteria.for_ids(arr)