Эффективность запросов MongoDB GridFS один к одному в Ruby

Я использую MongoDB с Sinatra для приложения для iPhone.

У меня есть коллекция users MongoDB и коллекция picture GridFS. У каждого пользователя есть одно изображение, поэтому изначально я просто установил ObjectId для изображения таким же, как у соответствующего пользователя. Это упростило, данный ObjectId пользователя, получение изображения этого пользователя всего одним запросом. Затем я планировал сохранить хеш MD5 изображения в пользовательском объекте, чтобы iPhone знал, что нужно загрузить изображение, только если хэш MD5 изменился. Это сработало бы, но мне пришлось изменить класс Grid Ruby на получить MD5

Но тогда Кайл Банкер предложил просто сохранить picture_id вместо MD5 в пользовательском объекте. Но, если я это сделаю, учитывая пользователя ObjectId, мне придется сначала запросить picture_id от пользователя, а затем запросить изображение (2 запроса). Есть ли способ одним запросом получить изображение с учетом ObjectId пользователя? Читая индексы GridFS, я думаю, что есть способ сохраните ObjectId пользователя в метаданных изображения, а затем установите индекс в этом поле. Таким образом, я мог бы сделать это в одном запросе. Если это так, как выглядит код для этого в Ruby?

Увы, стоит ли мне вообще заморачиваться? Я мог бы так же легко использовать picture_id для запроса изображения, что я сейчас и сделаю, но с синтаксической точки зрения также было бы неплохо иметь возможность запрашивать изображение (в одном индексированном/быстром запросе ) по user_id. Подобно тому, как Graph API от Facebook позволяет вам делать, например, http://graph.facebook.com/mattdipasquale/picture .


person ma11hew28    schedule 18.11.2010    source источник


Ответы (1)


Конечно. Как вы предлагаете, просто сохраните user_id где-нибудь в объекте файла изображения и создайте индекс для этого поля.

person Kyle Banker    schedule 18.11.2010
comment
Прохладный. Я просто запрашиваю picuture_id на данный момент. Но если я захочу, должен ли я сделать что-то вроде: @grid.put(image, :metadata => "4ce533a41467286a14000269") и coll.create_index("metadata")? - person ma11hew28; 18.11.2010
comment
Вы должны уметь делать @grid.put(image, :user_id =› foo) - person Kyle Banker; 18.11.2010
comment
Любые переданные параметры, не являющиеся официальными, будут сохранены как дополнительные ключи. См. документацию по API: api.mongodb.org/ruby/1.1.2 /Монго/Grid.html - person Kyle Banker; 18.11.2010