10

私がやろうとしているのは、メタデータのフィールドをクエリして、GridFSファイルのリストをフェッチすることです。たとえば、次のようなGridFSファイルドキュメントを取得しました。

{ "_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ファイルを取得することはできませんか?

4

3 に答える 3

17

残念ながら、ネストされたBasicDBObjectsで動作させることができませんでした。

最後に、正常に機能するドット表記を使用していました。

// This query fetches the files I need
BasicDBObject query = new BasicDBObject("metadata.target_field", "abcdefg"));
List<GridFSDBFile> files = gridFs.find(query);
于 2012-04-24T07:48:44.090 に答える
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")));
于 2014-12-17T13:13:40.060 に答える
0

よりシンプル:

GridFSDBFile gridFile = fsDocs.findOne(new BasicDBObject("md5","1b21bc40a456befc7d2ee10b0e25fabf"));
于 2014-12-31T01:42:54.110 に答える