mongodb安装
前一段时间,我们遇到了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
mongodb安装