2010-11-18 3 views
0

iPhone 앱용 MongoDB w/Sinatra를 사용하고 있습니다.Ruby에서 MongoDB GridFS 일대일 쿼리 효율성

나는 users MongoDB 컬렉션과 picture GridFS 컬렉션이 있습니다. 각 사용자는 하나의 그림을 가지고 있으므로 처음에는 그림을 해당 사용자와 동일하게 설정하기 위해 ObjectId을 설정했습니다. 그 덕분에 쉽게, given the user's ObjectId, get the picture of that user with just one query. 그런 다음, MD5 해시가 변경된 경우에만 아이폰이 그림을 다운로드 할 수 있도록 그림의 MD5 해시를 사용자 개체에 저장하려고했습니다. 이 일 것입니다,하지만 난 사용자 개체에 대신 MD5, 나는 그냥 picture_id를 저장 한 후 modify the Grid Ruby class to get the MD5

그러나, Kyle Bankersuggested했다. 그러나 사용자가 ObjectId 일 경우 사용자에게 picture_id을 먼저 쿼리 한 다음 그림 (2 개의 쿼리)을 쿼리해야합니다. 한 쿼리에서 사용자의 ObjectId 주어진 그림을 얻는 방법이 있습니까? GridFS indexes을 읽고, 나는 그림의 메타 데이터에 사용자의 ObjectId을 저장 한 다음 해당 필드에 색인을 설정하는 방법이 있다고 생각합니다. 그런 식으로 한 번의 쿼리로 할 수 있습니다. 그것이 맞다면 Ruby에서 코드를 어떻게 보이게할까요?

아아, 내가 괴롭혀 야합니까? 난 그냥 picture_id 그림을 쿼리 할 수 ​​있습니다, 내가 지금 할거야,하지만 그것도 좋을거야, 구문 관점에서 그림을 쿼리 할 수 ​​있습니다 (하나의 색인 된/빠른 쿼리)에 의해 user_id. 페이스 북의 그래프 api와 마찬가지로, http://graph.facebook.com/mattdipasquale/picture과 같이 할 수 있습니다.

답변

1

확실히. 제안한 것처럼, user_id를 그림의 파일 객체 어딘가에 저장하고 해당 필드에 색인을 작성하십시오.

+0

차가움. 지금은 'picuture_id'로 쿼리하고 있습니다. 그러나, 원한다면'@ grid.put (image, : metadata => "4ce533a41467286a14000269")와'coll.create_index ("metadata")'같은 것을해야합니까? – ma11hew28

+0

@ grid.put (image, : user_id => foo) 할 수 있어야합니다. –

+0

공식 옵션이 아닌 옵션은 추가 키로 저장됩니다. API 문서 http://api.mongodb.org/ruby/1.1.2/Mongo/Grid.html을 참조하십시오. –