Выбор дочернего элемента с помощью mongoid - PullRequest
0 голосов
/ 02 февраля 2012

У меня есть структура, где

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

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

Вот пример структуры. Ниже приведены два участника, каждый из которых имеет только один «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/733355f69@N02/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

Ответы [ 2 ]

1 голос
/ 02 февраля 2012

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

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

Это вытянет все фотографии из массива had_drinks, где такая фотография существует. Вы должны отфильтровать это на стороне клиента. 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 голосов
/ 02 февраля 2012

Я бы использовал $ elemMatch , чтобы получить действительного участника, а затем вытащить из этого фотографию, согласно вашему редактированию.Что-то вроде:

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

Может быть способ ограничить возврат только фотографией (или, как в других ответах, всеми напитками), но я бы сказал, если вам действительно нужномного случайного доступа к фотографиям, они должны быть в собственной коллекции.

...