我不久前开始使用带有Gridfs的MongoDB,因为我需要存储大于16mb的文档。到目前为止,保存和加载文档工作正常。 接下来,我想知道如何为存储在Gridfs中的文件指定查询。让我们假设我的班级实例如下:
public class Test {
private String id;
private int test;
}
如果我想查询具有特定值" test"的文件,我该如何在GridFS中执行此操作?我知道我可以保存我的文件并存储其他元数据。 因此,我可以将测试值存储在文件的元数据中。 要检索文件的值测试,我会这样做:
String id = "...";
GridFS fs = new GridFS(mongoDB, "TESTFS");
BasicDBObject dbobj = new BasicDBObject();
dbobj.put("filename", id);
GridFSDBFile fsFile = fs.findOne(dbobj);
BasicDBObject metadata = (BasicDBObject) fsFile.get("metadata");
System.out.println("Test: " + metadata.get("test"));
使用元数据,是否有更简单的方法来提取"测试"某个文件的值(不加载完整文件,反序列化json字符串等)。
这种方法的缺点是我必须明确地存储元数据。如果我想查询其他信息,我需要将其引入所有数据的元数据中。这是对的吗?
是否有替代方法可以在元数据中存储此类信息?或者我如何在Gridfs中查询特定信息? 这显然是一个非常简单的例子。尝试执行更复杂的查询时会出现同样的问题。
答案 0 :(得分:0)
正如@wdberkeley所指出的-您可以显式查询db['fs'].files
,而不必每次都提取整个文件(实际上,不是最好的主意)。您可以使用上述集合中的find来执行此操作(查询方法与在MongoDB控制台中形成的查询相同-请翻译成您的语言):
db['fs'].files.find({'metadata.test': '#### - the value you want to query for - $$$'})
在MongoDB控制台中通过大多数驱动程序返回的游标将使您无需读取文件内容即可读取元数据。