查询MongoDB GridFS元数据(Java)

我要做的是通过查询元数据字段来获取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 files = gridFs.find(query); 

该列表总是空的。 否则查询文件名或uploadDate完美无缺。 是不是可以通过嵌套属性获取GridFS文件?

不幸的是,我没有使用嵌套的BasicDBObjects。

最后我使用了点符号,工作正常:

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

从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 files = gridFs.find(buildMetadataSearchQuery(new BasicDBObject("target_field", "abcdefg"))); 

更简单:

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