2010-11-18 44 views
0

我正在使用MongoDB w/Sinatra for iPhone应用程序。Ruby中的MongoDB GridFS一对一查询效率

我有一个users MongoDB集合和一个picture GridFS集合。每个用户都有一张图片,因此,最初,我只是将图片设置为ObjectId,使其与相应的用户相同。这很容易,given the user's ObjectId, get the picture of that user with just one query。然后,我打算将图片的MD5哈希值存储在用户对象中,以便iPhone只有在MD5哈希值发生变化时才知道要下载图片。这会工作,但我不得不modify the Grid Ruby class to get the MD5

但随后,Kyle Bankersuggested,我只是存储picture_id,而不是MD5,在用户对象。但是,如果我这样做,给用户ObjectId,我必须先从用户查询picture_id,然后查询图片(2查询)。有一种方法可以在一个查询中得到用户的图片ObjectId?阅读GridFS indexes,我认为有一种方法可以将用户的ObjectId存储在图片的元数据中,然后在该字段上设置索引。这样,我可以在一个查询中做到这一点。如果这是正确的,那么Ruby中的代码看起来如何?

唉,我还要麻烦吗?我可以很容易地使用picture_id来查询图片,这是我现在要做的,但从语法的角度来看,它也很好,能够查询图片(在一个索引/快速查询中)由user_id。有点像Facebook的图表API可以让你做,例如,http://graph.facebook.com/mattdipasquale/picture

回答

1

当然。就像你建议的那样,只需将user_id存储在图片的文件对象中的某个位置,然后在该字段上构建一个索引。

+0

很酷。我现在只是用'picuture_id'查询。但是,如果我想,我应该做些什么:'@ grid.put(image,:metadata =>“4ce533a41467286a14000269”)'和'coll.create_index(“metadata”)'? – ma11hew28 2010-11-18 18:16:55

+0

您应该可以执行@ grid.put(image,:user_id => foo) – 2010-11-18 19:13:45

+0

任何通过非官方选项的选项将被另存为额外的密钥。查看API文档:http://api.mongodb.org/ruby/1.1.2/Mongo/Grid.html – 2010-11-18 19:14:55