Mongoid以优化的方式在嵌入式文档中搜索

时间:2015-03-11 09:13:21

标签: mongoid

我有2个文档用户和书籍

class User
  embeds_many :books
end

class Book
  embedded_in :user
end

我想在某些条件下搜索图书,是否有一种有效的方法可以做到这一点,而不是循环所有用户以及书籍上的每个用户循环来检索符合条件的书籍。

1 个答案:

答案 0 :(得分:1)

当你说:

embeds_many :books

实际上在MongoDB中生成一个哈希数组,然后在该数组及其元素周围包装一些Mongoid内容。因此,您可以搜索嵌入式文档,就像搜索任何其他哈希数组一样。

例如,如果您的Book有标题字段,那么您可以说:

users = User.where('books.title' => /Pancakes/)

查找有关煎饼书籍的所有用户。当然,这会给你一堆User而不是Book。嵌入式文档本身不存在,它们只是父文档的一部分,因此您必须通过父文档。但是,一旦你有一些User,你可以提取你感兴趣的书籍:

books = users.map(&:books).flatten.select { |b| b.title =~ /Pancakes/ }

如果您的only很大并且您不想将整个User拉出MongoDB,您也可以投入User

# Some versions of Mongoid will get upset if you don't include :id
books = users.only(:books, :id).map...

如果你做了很多这样的事情,那么Book可能不应该嵌入User内。