2010-11-18 34 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