不久前,我们遇到了MongoDB GridFS的奇怪行为,这使我为MongoDB Java驱动程序创建了一个故障 单 。
今天,我在浏览器书签中找到了指向故障单的链接。 该票证目前尚未解决,因此我认为值得一小篇博文,以防其他人遇到此问题。
让我们看一下以下简化的Java服务:
public class GridFsService {private GridFS gridFs;public void connect(String mongoDbHost, String databaseName) throws UnknownHostException {DB db = Mongo.connect(new DBAddress(mongoDbHost, databaseName));this.gridFs = new GridFS(db, "myBucket");}public void removeGridFsFile(String id) {GridFSDBFile file = this.gridFs.findOne(new ObjectId(id));this.gridFs.remove(file);}// .. other methods to create and update files
}
该服务使用MongoDB Java驱动程序来创建,更新和删除GridFS中的文件。 但是,removeGridFsFile()方法存在严重缺陷。 猜猜如果将无效的id传递给removeGridFsFile()会发生什么。 gridFs.findOne()对于不存在的ID返回null。 因此,将null传递给gridFs.remove(),然后删除当前bucket中的所有文件 。
解决这个问题很容易。 只需添加一个空检查或使用另一个采用ObjectId而不是GridFsDBFile的GridFS remove()方法即可:
public void removeGridFsFile(String id) {this.gridFs.remove(new ObjectId(id));
}
使用这种方式,如果将无效的ID传递给removeGridFsFile(),则一切正常,而不会删除任何文件。 为了确保不会再次发生这种情况,我测试了如果将null传递给三种不同的remove()方法中的任何一种,会发生什么情况:
gridFs.remove((String)null); // nothing happens
gridFs.remove((ObjectId)null); // nothing happens
gridFs.remove((DBObject)null); // all files from bucket are removed
我不知道这是否是故意的行为。 gridFs.remove(DBObject query)的Javadoc注释告诉我,它将删除所有与给定查询匹配的文件 。 但是,如果打算这样做,我认为应该在javadoc注释中明确指出,传递null会删除存储桶中的所有文件。
翻译自: https://www.javacodegeeks.com/2013/11/mongodb-gridfs-remove-method-deletes-all-files-in-bucket.html