2012-02-01 2 views
0

У меня есть структура, в которойВыбор элемента ребенка с Mongoid

Участника будет иметь встроенную много «Had_drinks» объектов .. каждый «Had_drink» имеет возможность (не всегда) иметь один «Фото» объект внедренную в нем ...

У меня есть идентификатор фотографии и вы хотите вытащить весь объект фотографии. Корень документа начинается Участник

Вот пример структуры .. Ниже два участников каждым только один «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 и базы данных документов, мне нужно запустить запрос из корня и работать вниз?

Я пытался что-то вроде этого

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

Но думаю, я милях до сих пор

---- ИЗМЕНИТЬ :) Думая через Я думаю, что мне нужно сделать следующий запрос

1: Получить любой участник с этой фотографией

2: Выберите первый участник

3: Фильтр их фотографии к фотографиям с этим идентификатором

4: Выберите первую фотографию (только на самом деле когда-нибудь один)

Просто не знаю, как сделать этот запрос в моих ограниченной Mongoid/MongoDB знаний

ответ

1

Если у вас есть идентификатор фотографии, вы можете сделать что-то вроде этого:

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

это будет тянуть все фотографии из массива had_drinks где такая фотография существует. Вы должны отфильтровать его на стороне клиента. AFAIK, в настоящее время нет способа получить один элемент массива (за исключением, например, сокращения карты).

В рубина это было бы что-то вроде этого:

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

Вам не нужно '$ elemMatch', когда есть только одно условие для встречи. –

+0

@ Сергио Туленцев не знал этого - спасибо. –

Смежные вопросы