Mongoid: возвращает различные значения для объектов embedded_in, которые соответствуют параметрам - PullRequest
2 голосов
/ 11 сентября 2011

У меня есть два класса

class Claim
  include Mongoid::Document
  embeds_many :claim_fields
  belongs_to :user
  ...
end

class ClaimField
  include Mongoid::Document
  embedded_in :claim
  field :title
  field :value
  ...
end

Мне нужно получить все уникальные значения для полей заявок с текущим названием для моей заявки через БД (не для Ruby - это слишком медленно для тысяч записей)

Я уже попробовал это

user = User.find(...)
Claim.collection.distinct("claim_fields.value", {:user_id => user.id, "claim_fields.title" => some_title})
# that is the same as user.claims.find(...).distinct("claim_fields.value")

Но он возвращает ВСЕ значения Claim_fields, и мне нужно, чтобы он возвращал только те значения полей претензий с нужным мне названием.

PS выглядит так, что мне нужен какой-то MapReduce здесь

1 Ответ

3 голосов
/ 11 сентября 2011

Основная проблема заключается в том, что запросы MongoDB возвращают только целые документы. Вы фильтруете на claim_fields.title, но система возвращает все Claim документы, которые соответствуют.

Вы делаете distinct, но MongoDB обрабатывает подобъекты и документы по-разному. В результате, distinct, вероятно, не делает то, что вы хотите.

Здесь есть два возможных решения:

  1. Предварительный расчет через M / R. ( как вы предлагаете )
  2. Разбейте их на две коллекции.

Относительно # 2, нет необходимости встраивать объекты, как у вас. Встраивание должно выполняться на основе запросов, которые вы планируете выполнять чаще всего. Так что, если это общий запрос, то эти отдельные документы будут справедливыми.

...