选择具有mongoid的子元素

时间:2012-02-01 22:38:40

标签: ruby mongodb mongoid

我的结构是

参与者将嵌入许多“Had_drinks”对象..每个“Had_drink”都有可能(并非总是)嵌入一个“Photo”对象......

我有照片的ID,想要拉出整个照片对象。文件的根源在参与者

开始

以下是结构的示例..以下是两个参与者,在此示例中每个只有一个“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:将照片过滤为具有此ID的照片

4:选择第一张照片(实际上只会是一张)

只是不确定如何在我有限的mongoid / mongodb知识中进行查询

2 个答案:

答案 0 :(得分:1)

如果您有照片ID,则可以执行以下操作:

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

答案 1 :(得分:0)

我会使用$elemMatch来获取实际参与者,然后根据您的编辑将照片拉出来。类似的东西:

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

可能有一种方法可以将回报限制在只有照片(或者,就像其他答案一样,所有的饮料),但我会说如果你真的需要大量随机访问照片,他们应该在他们自己的收藏中。