MongoDB: Как запросить или контейнерный документ, который содержит только внедренные документы с определенным значением атрибута? - PullRequest
0 голосов
/ 17 октября 2011

Хорошо, позвольте мне попытаться объяснить, чего я пытаюсь достичь ...

Допустим, у меня есть коллекция ДОМА, в которую встроены КОМНАТЫ. В каждом доме много комнат. Допустим, у каждой комнаты есть цветовой атрибут (синий, красный, зеленый и т. Д.)

Теперь, если я хочу получить все дома, в которых есть комната синего цвета, я могу пойти дальше и просто сделать, например,

House.where(:'rooms.color' => :blue)

Однако, что я действительно хочу - это опросить все дома, в которых есть ТОЛЬКО синие комнаты. И что я понятия не имею, как это сделать ... Я мог бы создать новый атрибут на уровне ДОМА, чтобы "пометить", если комнаты имеют одинаковые заданные цвета ... но я бы предпочел этого избежать, если бы мог, так как мой текущий набор данных необходимо обновить, чтобы отразить это.

Спасибо

Alex

Ответы [ 3 ]

0 голосов
/ 17 октября 2011

Думая об этом с шагом назад ... Я на самом деле поступил неправильно, иногда нужно отрицать:)

По сути, дом, в котором есть только синие комнаты, означает, что этот домне имеет комнат других цветов ...

Так воображая, что у меня есть конечный набор возможных цветов, таких как:: красный: зеленый: синий, тогда, чтобы найти дом, в котором есть только синие комнаты, мне нужно толькочтобы найти дом, который не имеет: красный или: зеленые комнаты:)

House.where(:'rooms.color'.nin => [:red, :green]) 

должен сделать трюк:)

Алекс

0 голосов
/ 20 октября 2011

@ Алекс. Вы лучше судите о своем наборе данных, но теоретически следующее также должно помочь.

house_ids = House.where("rooms.color" => :blue).only(:_id).map(&:_id)
unwanted_house_ids = House.where("rooms.color".to_sym.ne => :blue).only(:_id).map(&:_id)
houses_with_only_blue_rooms = House.all.for_ids(house_ids - unwanted_house_ids)
0 голосов
/ 17 октября 2011

Вы пробовали?

House.only(:'rooms.color' => :blue)
...