在 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 & Rails 中使用数组字段?

如果其中一个字段存在于 mongoid 的另一个模型中,则获取对象数组

如何从没有“每个”块的 Mongoid::Criteria 获取结果数组

Mongoid 不在查询中

rails 4 gem 'mongoid_slug' 无法按 id 搜索