Reputation: 126457
I'm using MongoDB w/ Sinatra for an iPhone app.
I have a users
MongoDB collection and a picture
GridFS collection. Each user has one picture, so, initially, I just set the ObjectId
for the picture to be the same as the corresponding user. That made it easy to, given the user's ObjectId, get the picture of that user with just one query. Then, I was planning to store the MD5 hash of the picture in the user object so that the iPhone would know to download the picture only if the MD5 hash had changed. This would work, but I had to modify the Grid
Ruby class to get the MD5
But then, Kyle Banker suggested that I just store the picture_id
, instead of the MD5, in the user object. But, if I do that, given a user ObjectId
, I'd have to first query the picture_id
from the user, and then query the picture (2 queries). Is there a way, in one query, to get the picture given a user's ObjectId
? Reading up on GridFS indexes, I think there's a way to store the user's ObjectId
in the meta data of the picture and then set an index on that field. That way, I could do it in one query. If that's correct, what's the code look like to do that in Ruby?
Alas, should I even bother? I could just as easily use the picture_id
to query the picture, which is what I'll do for now, but it'd also be nice, from a syntactical perspective, to be able to query the picture (in one indexed/fast query) by the user_id
. Kinda like Facebook's graph api lets you do, e.g., http://graph.facebook.com/mattdipasquale/picture.
Upvotes: 0
Views: 420
Reputation: 4359
Sure. Like you suggest, just store the user_id somewhere in the picture's file object, and build an an index on that field.
Upvotes: 1