我要做的是通过查询元数据字段来获取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文件?
答案 0 :(得分:16)
不幸的是我没有使用嵌套的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):
要在整个嵌入文档上指定相等匹配,请使用查询文档{:}其中是要匹配的文档。嵌入式文档中的等式匹配需要指定的完全匹配,包括字段顺序。
使用点表示法与嵌入文档中的特定字段匹配。嵌入文档中特定字段的等同匹配将选择集合中的文档,其中嵌入文档包含具有指定值的指定字段。嵌入的文档可以包含其他字段。
我写了一个简单的代码来翻译&#34;文档符号&#34;在&#34;点缀符号&#34; 。我希望它有用。
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")));
答案 2 :(得分:0)
简单:
GridFSDBFile gridFile = fsDocs.findOne(new BasicDBObject("md5","1b21bc40a456befc7d2ee10b0e25fabf"));