2013-04-16 2 views
1

임베디드 모델을 쿼리 할 때 임베디드 모델의 인스턴스를 포함하는 많은 부모 레코드가 있음에도 불구하고 레코드가 반환되지 않습니다. 내가 잘 밴드 (Band.all, Band.find 등)을 조회 할 수 있습니다Mongoid 임베디드 문서가 쿼리를 위해 빈 반환

class Band 
    include Mongoid::Document 
    embeds_one :label 
end 

class Label 
    include Mongoid::Document 
    field :name, type: String 
    embedded_in :band 
end 

,하지만 난 라벨을 쿼리 할 때 반환되는 값이 없습니다 :

는 두 가지 모델로하는 Band에 포함 된 Label 있습니다. 예를 들어 :

내가 포함 된 레이블이 밴드를 만들고, 저장 : 다음

> b = Band.create 
=> #<Band _id: 516cff525543d8842e000008, _type: nil> 
> b.build_label name: "new label" 
=> #<Label _id: 516cff5a5543d8842e000009, _type: nil, name: "new label"> 
> b.save 
=> true 

내가 밴드 모델을 조회, 모든 괜찮 :

> Band.all.to_a 
=> [#<Band _id: 516cff525543d8842e000008, _type: nil>] 
> Band.count 
=> 1 
> Band.first.label 
=> #<Label _id: 516cff5a5543d8842e000009, _type: nil, name: "new label"> 
> Band.find "516cff525543d8842e000008" 
=> #<Band _id: 516cff525543d8842e000008, _type: nil> 

을하지만 쿼리 할 때 레이블 모델, 아무 것도 나타나지 않습니다!

> Label.all.to_a 
=> [] 
> Label.count 
=> 0 
> Label.last 
=> nil 
> Label.first 
=> nil 
> Label.find "516cff5a5543d8842e000009" # this is the label id from Band 
=> nil 

나는 이것이 정상적인 동작이 아니라는 점을 거의 확실하게 나타냅니다. 이 코드는 여기 몽고 이드 문서의 예제에서 직접 가져온 것입니다 : http://mongoid.org/en/mongoid/docs/relations.html#embeds_one

무엇이 누락 되었습니까?

답변

2

mongo에서는 검색어가 항상 다른 문서를 포함 할 수있는 전체 문서를 타겟팅합니다. mongo의 경우 JSON/BSON 문서 중 하나 일뿐입니다. 이제 Label.all 또는 Label.allLabel 컬렉션을 쿼리하는 것과 같습니다. 레이블은 Label 컬렉션에 저장되지 않으므로 이러한 쿼리는 아무 것도 반환하지 않습니다. 그러나 여전히

Band.where(:'labels.name' => "rock") 

당신이 특정 레이블로 모든 밴드를 얻으려면이 괜찮처럼

Band.where(:'labels._id' => "516cff5a5543d8842e000009") 

또는 무언가를 호출하여 Band 컬렉션 라벨을 조회 할 수 있습니다. 그러나 모든 레이블을이 방법으로 가져 오는 것은 비용이 많이 들고 권장되지 않습니다. 주요 유스 케이스는 무엇입니까? 밴드에 라벨을 표시하거나 특정 라벨이 붙은 밴드를 얻는다면 삽입하는 것이 좋습니다. 그렇지 않으면 관계 (has_many/belongs_to)를 사용하거나 완전히 비정규 화 (denormalize) 할 수 있습니다 (즉, 중복 데이터로 이어지는).

+0

명확한 설명 주셔서 감사합니다. 나는 특별한 유스 케이스를 가지고 있지 않았다. 나는 단지 그것을 알아 차렸고, 이상한 행동이라고 생각했다. 임베디드 몽고드 모델에 대한 질문을 할 때 몽고 인은 적어도 경고를 던져서는 안된다. –

+0

@SherwinYu, 이해할 수 있더라도 직관력이 없다는 것이 맞습니다. 불행히도, 이것은 몽고 이드 (몽구스)의 많은 코너에서 그렇습니다. –

0

난 has_many, has_one, belongs_to 메서드를 사용하여 Label.count와 같이 원하는대로 쿼리를 실행할 수 있도록해야한다고 생각합니다.

문서를 다른 문서에 포함하면 문서의 일부 (일련 화 된 속성)가됩니다. 라벨을 선택하려면 먼저 Band를 찾아 라벨 속성을 확인해야합니다. 그것은 확실히 작동해야합니다.

+0

정말인가요? 임베디드 문서의 경우에도 기본 동작이 아니기 때문에 매우 직관적 인 것처럼 보입니다. –

관련 문제