2015-03-11 3 views
1

у меня есть 2 документов пользователей и книгаMongoid поиск во встроенных документах оптимизированы

class User 
    embeds_many :books 
end 

class Book 
    embedded_in :user 
end 

Я хочу найти книги на некоторых условиях, Есть ли эффективный способ сделать это, а не петлят на все пользователь и для каждого пользовательского цикла в своих книгах, чтобы получить книги, соответствующие условиям.

ответ

1

Когда вы говорите:

embeds_many :books 

, что на самом деле производит массив хэшей внутри MongoDB, а затем оборачивает некоторые Mongoid вещи вокруг этого массива и его элементов. Таким образом, вы просматриваете встроенные документы, как если бы вы искали любой другой массив хешей.

Например, если ваш Book имеет заголовок поля, то вы могли бы сказать:

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

найти всех пользователей с книгами о блинах. Конечно, это дает вам кучу User s, а не Book s. Встроенные документы не существуют сами по себе, они всего лишь часть их родительского документа, поэтому вам нужно пройти через родителя. Но, как только у вас есть какие-то User с, вы можете извлечь книги вы заинтересованы в:

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

Вы также можете бросить в only, если ваши User s большие и вы не хотите, чтобы вытащить весь User s из MongoDB:

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

Если вы делаете такие вещи много, то возможно Book не должны быть встроены в User.

Смежные вопросы