2012-02-01 12 views
0

と子要素を選択すると、私はmongoid

参加者は...それぞれ「Had_drinkは」埋め込まれたシングル「フォト」オブジェクトを持つ可能性を(常にではない)があり、多くの「Had_drinks」オブジェクトが埋め込まれているだろうな構造を持っていますその中に...

私は写真のIDを持っていて、写真のオブジェクト全体を引き出したいと思います。ドキュメントのルートは、下の2人の参加者がそれぞれ一つだけ、この例では「had_drink」と最初の参加者を持っている彼ら

{ 
    _id: "4f0ecfe57e65260001000002", 
    had_drinks: [ 
     { 
     _id: "4f0ed1357e65260001000004", 
     at: "2012-01-07T00:00:00-08:00", 
     beer_id: "4f0ed1357e65260001000003", 
     cost: 3.5, 
     location: "Quakers", 
     photo: { 
      photo_id: "66832993035", 
      page_url: "http://www.flickr.com/photos/[email protected]/66832993035/", 
      square_url: "http://farm8.staticflickr.com/7035/668a3993035_fb180e39648_s.jpg", 
      thumbnail_url: "http://farm8.staticflickr.com/7035/6sad683993035_fb65180e9648_t.jpg", 
      small_url: "http://farm8.staticflickr.com/7035/66839asd93035_fb1s80e9648_m.jpg", 
      medium_url: "http://farm8.staticflickr.com/7035/668s3993035_fb18h0e9648.jpg", 
      large_url: "http://farm8.staticflickr.com/7035/66839v93035_fb180e9648_b.jpg", 
      original_url: null 
      }, 
     rating: "4", 
     uploaded_at: "2012-01-12T04:25:25-08:00" 
     } 
    ], 
    mongoid_user_id: "4f0ecf3e57e65260001000001", 
    name: "Michael Mark" 
}, 
{ 
    _id: "4f08aa477eddd05000100000c", 
    had_drinks: [ 
    { 
     _id: "4f0ff0513942d4e000100000b", 
     at: "2012-01-07T030:00:00-08:00", 
     beer_id: "4f0ff0561394d74e0001000009", 
     cost: 4.1, 
     location: "Bootleggers", 
     photo: null, 
     rating: "3", 
     uploaded_at: "2012-01-13T030:50:25-08:00" 
    } 
    ], 
    mongoid_user_id: "4f08aa477e34ddd0000100000b", 
    name: "Daniel M" 
}, 

と一緒に写真を持っている...ここで

は構造の一例である参加者から始まりますどのように写真を撮ることができますか? 私はmongoidとドキュメントデータベースを短時間で学んだので、ルートからクエリを開始して作業する必要がありますか?

私は、私は次のクエリ

を行う必要があると思いを通してそれを考えるEDIT :) ----この

Participant.where(:had_drinks.where(:photo.photo_id => params[:id])) 

ような何かをしようが、私はマイルこれまで

オフだと思った

1:この写真

2で任意の参加者を取得します:最初の参加者

を選択

3:このID

4で写真に自分絞り込む:最初の写真を選択します(唯一実際に今までとなります1)

私の限られたmongoid/MongoDBの知識

で、そのクエリを実行する方法だけでわかりません

答えて

1

あなたは写真付き身分証明書をお持ちの場合、あなたはこのような何か行うことができます。had_drinks配列からすべての写真を引っ張ります

db.participants.find({'had_drinks.photo.photo_id': '66832993035'}, 
        {'had_drinks.photo': 1}) 

をそのような写真が存在する場所。クライアントサイドでフィルタリングする必要があります。 AFAIKでは、現在、単一の配列要素を取得する方法はありません(map-reduceを除く)。 Rubyで

これは、このようなものになるだろう:

participant = Participant.where('had_drinks.photo.photo_id': '66832993035').first 
photo = participant.had_drinks.map{|hd| hd['photo']}. # get only photos 
        compact. # remove nils 
        select{|p| p['photo_id'] == '66832993035'}. # get only relevant photos 
        first # and pick first 
        # done 
0

私は、実際の参加者を得るために$elemMatchを使用して、あなたの編集ごとに、その外の写真を引き出します。以下のような何か:

Participant.where(:had_drinks => {"$elemMatch" => {:photo => {:id => params[:id]}}}) 

だけの写真への復帰を制限する方法(他の回答のように、または、飲料の全て)があるかもしれませんが、あなたは本当にたくさんのを必要とする場合、私は言うだろう写真へのランダムアクセス、彼らは自分のコレクションにする必要があります。

+0

満たす条件が1つしかない場合は、 '$ elemMatch'は必要ありません。 –

+0

@SergioTulentsevはそれを知らなかった - ありがとう。 –