我在设计用于比较两个图像的更新功能时遇到了一些问题,如果不同,请从Mongo中删除现有图像和数据,并将其替换为新副本。问题是,每个组件都可以单独工作。加载功能将成功上传图像和Bson文档。删除方法将成功(似乎)删除它们;文档,fs.files条目和fs.chunks条目。
但是,当删除条目然后继续上传新图像时,只会将fs.files条目和BsonDocument推送到服务器。实际图像没有了。
我正在为Windows运行MongoDB 3.2.6。
替换块后跟上传块
if (newMD5.Equals(oldMD5) == false)
{
Debug.WriteLine("Updating image " + fileWithExt);
BsonValue targetId = docCollection.FindOne(Query.EQ("id", fileNoExt))["_id"];
deleteImageEntry(Query.EQ("_id", new ObjectId(targetId.ToString())));
//continues to upload replacement
} else
{
continue;
}
}
//create new entry
uploadInfo = mongoFileSystem.Upload(memStream, fileFs);
BsonDocument entry = new BsonDocument();
entry.Add("fileId", uploadInfo.Id);
entry.Add("id", fileNoExt);
entry.Add("filename", fileFs);
entry.Add("user", "");
//appends to image collection
var newItemInfo = docCollection.Save(entry);
删除方法
public static bool deleteImageEntry(IMongoQuery query)
{
MongoInterface mongo = new MongoInterface();
try
{
var docCollection = mongo.Database.GetCollection("employees");
var imageCollection = mongo.Database.GetCollection<EmployeeImage>("employees");
var toDelete = docCollection.FindOne(query);
BsonValue fileId = toDelete.GetValue("fileId");
mongo.Gridfs.DeleteById(fileId);
WriteConcernResult wresult = imageCollection.Remove(query);
}
catch (Exception e)
{
Debug.WriteLine("Image could not be deleted \n\r" + e.Message);
return false;
}
return true;
}
对不起代码很乱,我做了很多游击测试,试图找到原因。类似的代码在该计划的其他部分也有效。
答案 0 :(得分:0)
这很令人尴尬。经过几个小时的调试后,原来是MD5.ComputerHash()函数将memStream迭代器设置到最后,因此没有上传数据。使用memStream.Position = 0;解决了这个问题。