Rails 3: ошибка MongoDB при запросе вложенных документов с помощью $ in (работает при запросе корневого документа) - PullRequest
0 голосов
/ 18 ноября 2011

Я пытался это некоторое время, и пришел к выводу, что это может быть ошибка в драйвере Монго или что-то в этом роде, но для меня это не имеет смысла.

Модель:

class Container
  include Mongoid::Document

  embeds_many :subs

  ...
end

class Sub
  include Mongoid::Document

  embedded_in :container

  references_and_referenced_in_many :stuffs

  ...
end

Это позволяет мне делать такие запросы:

Container.where(:'subs.stuff_ids' => BSON::ObjectId('xxxx'))

или

Container.where(:'subs.stuff_ids'.in => [BSON::ObjectId('xxxx'), BSON::ObjectId('yyyy')])

Все это прекрасно работает и дает правильные результаты.

Это означает, что эти запросы должны дать мне доступ к соответствующим документам:

Container.subs.where(:stuff_ids => BSON::ObjectId('xxxx'))

=> Работает, возвращает список правильных сабов

НО

Container.subs.where(:stuff_ids.in => [BSON::ObjectId('xxxx'), BSON::ObjectId('yyyy')])

=> ВСЕГДА возвращает 0 подпрограмм ... это не имеет смысла, так как тот же запрос к "контейнерам" возвращает правильный список контейнеров с сопоставлениями подпрограмм, но запрос подпрограмм из данного "контейнера" ​​никогда не работает с использованием " $ в "

пс:

это включено: Rails 3.0.10, Mongoid 2.2.0 и Mongo Driver: 1.4.0

Есть идеи?

Ответы [ 2 ]

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

Ответ Ника Хоффмана о Mongoid Google Group (http://groups.google.com/group/mongoid/browse_thread/thread/9e07de1f3f04d1ef)

Он работает в 2.3.3, поэтому я рекомендую обновить с 2.2.0:

class Parent 
  include Mongoid::Document 

  embeds_many :children 
end 

class Child 
  include Mongoid::Document 

  embedded_in :parent 

  has_and_belongs_to_many :others, :inverse_of => nil 
end 

class Other 
  include Mongoid::Document 
end 

Parent.delete_all 
Other.delete_all 

o1 = Other.create 
o2 = Other.create 
p = Parent.new 
p.children.new :others => [o1] 
p.children.new 
p.children.new :others => [o1, o2] 
p.save 

Parent.first.children.where(:other_ids.in => [o1.id, o2.id]).count 
=> 1 

требуется 'mongoid / version' 'Mongoid :: VERSION => "2.3.3"

0 голосов
/ 18 ноября 2011

В mongodb и его драйверах нет ничего плохого.Вот как это спроектировано для работы

   db.container.find({'subs.stuffids : {$in : [xx,yyy]}'})

Это эквивалент

  Container.where(:'subs.stuff_ids'.in => [BSON::ObjectId('xxxx'), BSON::ObjectId('yyyy')])

Но

Container.subs.where(:stuff_ids.in => [BSON::ObjectId('xxxx'), BSON::ObjectId('yyyy')])

Вы запрашиваете встроенный документ как обычный документЭто совершенно неправильно, и это будет работать нормально, если вместо этого вы определите отношение has_many. Embeds_many. Потому что has_many сохраняет подпрограммы в отдельном документе и добавляет ссылочные идентификаторы в другой документ, например, в реляционные внешние ключи.

...