我有2个文档用户和书籍
class User
embeds_many :books
end
class Book
embedded_in :user
end
我想在某些条件下搜索图书,是否有一种有效的方法可以做到这一点,而不是循环所有用户以及书籍上的每个用户循环来检索符合条件的书籍。
答案 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
内。