2012-02-01 4 views
0

J'ai la structure oùSélection d'un élément enfant avec MongoId

Un participant aura intégré de nombreux objets « Had_drinks » .. chaque « Had_drink » a la possibilité (pas toujours) d'avoir un seul objet « Photo » intégré à l'intérieur ...

J'ai l'ID d'une photo et je veux retirer l'ensemble de l'objet photo. La racine du document commence au Participant

Voici un exemple de la structure .. Ci-dessous deux participants chacun ont seulement un « had_drink » dans cet exemple et le premier participant a une photo avec leur

{ 
    _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" 
}, 

Comment puis-je obtenir la sortie de la photo? D'après ce que j'ai appris dans mon court temps avec mongoid et la base de données de document je dois commencer la question de la racine et travailler vers le bas?

Je cherchais quelque chose comme ça

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

Mais que je suis miles au large jusqu'à

---- EDIT :) Penser à travers Je suppose que je dois faire la requête suivante

1: Obtenez un participant avec cette photo

2: Sélectionnez le premier participant

3: filtrer leurs photos pour des photos avec cette id

4: Sélectionnez la première photo (ne fera en fait jamais un)

juste savez pas comment faire cette requête dans ma connaissance MongoId/MongoDB limitée

Répondre

1

Si vous avez une photo d'identité, vous pouvez faire quelque chose comme ceci:

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

Ça va tirer toutes les photos dehad_drinks tableau où cette photo existe. Vous devez le filtrer côté client. AFAIK, il n'y a actuellement aucun moyen de récupérer un seul élément de tableau (sauf pour map-reduce, bien sûr).

En ruby ​​ce serait quelque chose comme ceci:

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

J'utiliser $elemMatch pour obtenir le participant réelle, puis tirez la photo de cela, selon votre édition. Quelque chose comme:

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

Il peut y avoir un moyen de limiter le retour à juste la photo (ou, comme dans les autres réponses, toutes les boissons), mais je dirais que si vous avez vraiment besoin de beaucoup de l'accès aléatoire aux photos, ils devraient être dans leur propre collection.

+0

Vous n'avez pas besoin de '$ elemMatch' lorsqu'il n'y a qu'une seule condition à remplir. –

+0

@SergioTulentsev ne savait pas cela - merci. –