律师网站建设公司,网络推广工作能长久吗,开发一个安卓app多少钱,WordPress怎么批量上传图片不久前#xff0c;我们遇到了MongoDB GridFS的奇怪行为#xff0c;这使我为MongoDB Java驱动程序创建了一个故障 单 。 今天#xff0c;我在浏览器书签中找到了指向故障单的链接。 该票证目前尚未解决#xff0c;因此我认为值得一小篇博文#xff0c;以防其他人遇到此问题… 不久前我们遇到了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.removeDBObject query的Javadoc注释告诉我它将删除所有与给定查询匹配的文件 。 但是如果打算这样做我认为应该在javadoc注释中明确指出传递null会删除存储桶中的所有文件。 参考 MongoDBGridFS remove方法从mscharhagProgramming and Stuff博客的JCG合作伙伴 Michael Scharhag 删除存储桶中的所有文件 。 翻译自: https://www.javacodegeeks.com/2013/11/mongodb-gridfs-remove-method-deletes-all-files-in-bucket.html