2012-04-23 9 views
9

私がやっているのは、メタデータのフィールドを問い合わせてGridFSファイルのリストを取得することです。たとえば、私は次のように見ているGridFSファイルの文書を得た:MongoDB GridFSメタデータに関する問い合わせ(Java)

{ "_id" : { "$oid" : "4f95475f5ef4fb269dbac954"} , "chunkSize" : 262144 , "length" : 3077 , "md5" : "f24ea7ac05c5032f08808c6faabf413b" , "filename" : "file_xyz.txt" , "contentType" : null , "uploadDate" : { "$date" : "2012-04-23T12:13:19.606Z"} , "aliases" : null , "metadata" : { "target_field" : "abcdefg"}} 

そして私は「target_field」=「ABCDEFG」を含むすべてのファイルを照会します。私は次のようにクエリを作成しました:

BasicDBObject query = new BasicDBObject("metadata", new BasicDBObject("target_field", "abcdefg")); 
// gridFS Object Initialization skipped 
List<GridFSDBFile> files = gridFs.find(query); 

リストはすべて空です。それ以外の場合、ファイル名またはuploadDateを照会することは完全に機能します。ネストされた属性でGridFSファイルを取得することはできませんか?

+0

は、それはおそらく、あなたが何かをスペルミスしていませんか?これは私のマシンで正常に動作します。私はmongod 2.0.4とv2.7.3をJavaドライバに使用しています。 – Ren

答えて

15

残念ながら、ネストされたBasicDBObjectsで動作するようにはなりませんでした。上の平等の一致を指定するに埋め込まれた文書

完全一致:

// This query fetches the files I need 
BasicDBObject query = new BasicDBObject("metadata.target_field", "abcdefg")); 
List<GridFSDBFile> files = gridFs.find(query); 

+1

お返事ありがとうございました。私も同様の苦境を抱えていて、あなたの答えは私がそれらを解決するのを助けました。 –

0

にMongoDBのドキュメントから(http://docs.mongodb.org/manual/tutorial/query-documents/#exact-match-on-the-embedded-document):最後に

私は、ドット正常に動作表記を使用していましたすべての埋め込みドキュメントは、一致するドキュメントがあるクエリドキュメント{:}を使用します。埋め込みドキュメントの等価マッチでは、指定されたものとフィールドの順序を完全に一致させる必要があります。埋め込み文書

フィールドの平等マッチ埋め込み文書内の特定のフィールドによって一致するドット表記を使用します。埋め込みドキュメント内の特定のフィールドの等値一致は、埋め込みドキュメントが指定された値を持つ指定フィールドを含むコレクション内のドキュメントを選択します。埋め込みドキュメントには、追加のフィールドを含めることができます。


私は「ドット表記」に「文書の表記法」を翻訳するための簡単なコードを書きました。私はそれが役に立つことを願っています。あなたの目的のために

protected static void toDottedJson(Object o, String key, DBObject query) { 
    if (o instanceof Map) 
     for (Entry<?, ?> c : ((Map<?, ?>) o).entrySet()) 
      toDottedJson(c.getValue(), key + "." + c.getKey().toString(), 
        query); 
    else 
     query.put(key, o.toString()); 
} 

public static DBObject buildMetadataSearchQuery(DBObject searchQuery) { 
    BasicDBObject metadatSearchQuery = new BasicDBObject(); 
    for (Entry<?, ?> c : ((Map<?, ?>) searchQuery).entrySet()) 
     toDottedJson(c.getValue(), "metadata." 
       + c.getKey().toString(), 
       metadatSearchQuery); 
    return metadatSearchQuery; 
} 

List<GridFSDBFile> files = gridFs.find(buildMetadataSearchQuery(new BasicDBObject("target_field", "abcdefg"))); 

+0

このコードを使用する場合は注意してください。 '$ in'や' $ nin'のような演算子を含むクエリ全体を平坦化します。私は開発チームの健全性を信じていますが、これは避けて、最初からドット表記で書かれたクエリです。 – madmuffin

0

シンプル:

GridFSDBFile gridFile = fsDocs.findOne(new BasicDBObject("md5","1b21bc40a456befc7d2ee10b0e25fabf")); 
+2

おそらく、あなたは、読者がなぜそれを見つけようとするのではなく、このコードがどのように優れているか簡単であるかを説明することができますか? –

+0

問題は、md5コードでファイルを取得するのではなく、メタデータ部分内のプロパティでファイルを検索することでした。このプロパティは階層的にメタデータの下にあり、md5は実際の問題です。 – sebastian

関連する問題