访问GridFS时MongoDB抛出BsonInvalidOperationException

时间:2017-08-06 11:42:38

标签: java mongodb gridfs

此代码:

ServerAddress serverAddress = new ServerAddress(url, Integer.valueOf(port));
MongoCredential credential = MongoCredential.createScramSha1Credential(username,"admin",
 password.toCharArray());
MongoClient mongoClient = new MongoClient(serverAddress, Arrays.asList(credential));
MongoDatabase mongoDatabase = mongoClient.getDatabase("admin");
GridFSBucket gridFSBucket = GridFSBuckets.create(mongoDatabase);
gridFSBucket.find().forEach(
 new Block < GridFSFile > () {
  @Override
  public void apply(final GridFSFile gridFSFile) {
   System.out.println(gridFSFile.getFilename());
  }
 });

引发此错误:

org.bson.BsonInvalidOperationException: Value expected to be of type DOCUMENT is of unexpected type NULL
    at org.bson.BsonValue.throwIfInvalidType(BsonValue.java:419)
    at org.bson.BsonValue.asDocument(BsonValue.java:47)
    at org.bson.BsonDocument.getDocument(BsonDocument.java:506)

我对此感到困惑,因为使用MongoDB客户端(如Robomongo)我可以看到 fs.files

1 个答案:

答案 0 :(得分:0)

当“元数据”字段为空时,我看到了同样的问题。当文件的“元数据”字段为空时,mongo-java-driver似乎抛出异常。但是它应该是可选的(https://docs.mongodb.com/manual/core/gridfs/#files.metadata)。

检查其他字段。您可能会在文档中的某处出现空值。

“元数据”存在Jira问题 (https://jira.mongodb.org/browse/JAVA-2577)。

更新

来自https://jira.mongodb.org/browse/JAVA-2577的回答:metadata字段不应为空。

更新2

我找到了一个旧的MongoDB API的解决方案,该解决方案在3.x驱动程序中可用但不推荐使用。

GridFS gridFs = new GridFS(client.getDB("genisys"), "fs");
gridFs.getFileList().forEach(f -> System.out.println(f.get("filename")));