2010-11-18 24 views
0

J'utilise MongoDB w/Sinatra pour une application iPhone.MongoDB GridFS l'efficacité de la requête one-to-one en Ruby

J'ai une collection MongoDB users et une collection GridFS picture. Chaque utilisateur a une image, donc, au départ, je viens de définir le ObjectId pour que l'image soit la même que l'utilisateur correspondant. Cela a rendu facile, given the user's ObjectId, get the picture of that user with just one query. Ensuite, je prévoyais de stocker le hachage MD5 de l'image dans l'objet utilisateur afin que l'iPhone sache télécharger l'image uniquement si le hachage MD5 avait changé. Cela fonctionnerait, mais je devais modify the Grid Ruby class to get the MD5

Mais, Kyle Bankersuggested que je le magasin juste picture_id, au lieu du MD5, dans l'objet utilisateur. Mais, si je fais cela, étant donné un utilisateur ObjectId, je devrais d'abord interroger le picture_id de l'utilisateur, puis interroger l'image (2 requêtes). Existe-t-il un moyen, dans une requête, d'obtenir l'image donnée ObjectId d'un utilisateur? En lisant GridFS indexes, je pense qu'il existe un moyen de stocker ObjectId de l'utilisateur dans les métadonnées de l'image, puis de définir un index sur ce champ. De cette façon, je pourrais le faire dans une requête. Si c'est correct, à quoi ressemble le code dans Ruby?

Hélas, devrais-je même déranger? Je pourrais aussi facilement utiliser le picture_id pour interroger l'image, ce que je ferai pour l'instant, mais ce serait sympa, d'un point de vue syntaxique, de pouvoir interroger l'image (dans une requête indexée/rapide)) par le user_id. Un peu comme le graphique api de Facebook vous permet de faire, par exemple, http://graph.facebook.com/mattdipasquale/picture.

Répondre

1

Bien sûr. Comme vous le suggérez, stockez le user_id quelque part dans l'objet fichier de l'image, et construisez un index sur ce champ.

+0

Cool. Je suis juste interroger par 'picuture_id' pour le moment. Mais, si je le voulais, devrais-je faire quelque chose comme: '@ grid.put (image,: metadata =>" 4ce533a41467286a14000269 ")' et 'coll.create_index (" metadata ")'? – ma11hew28

+0

Vous devriez être capable de faire @ grid.put (image,: user_id => foo) –

+0

Toutes les options passées qui ne sont pas des options officielles seront sauvegardées en tant que clés supplémentaires. Voir les documents de l'API: http://api.mongodb.org/ruby/1.1.2/Mongo/Grid.html –