我有以下对象
public class FileMetadata
{
public string FileID { get; set; }
public string FileName { get; set; }
}
public class HashEntry
{
public ObjectId Id { get; set; }
public UInt32 Hash { get; set; }
public List<FileMetadata> FileList { get; set; }
}
我会有大量HashEntry
个对象,大部分都是40,000个,我想在MongoDB中创建一个新的HashEntry
,只有inputFile
添加HashEntry
1}}已不存在。如果存在,只需将文件添加到其FileList
集合。
var collection = _LocalDB.GetCollection<HashEntry>("Files");
foreach (var item in HashList)
{
var filter = Builders<HashEntry>.Filter.Eq("Hash", item);
var result = collection.Find(filter).ToList();
if (result.Count==0)
{
var newHash = new HashEntry();
newHash.FileList = new List<FileMetadata>();
newHash.Hash = item;
newHash.FileList.Add(inputFile);
collection.InsertOne(newHash);
}
else
{
var update = Builders<HashEntry>.Update.Push("FileList",inputFile);
collection.FindOneAndUpdate(filter,update);
}
}
我正在使用的代码需要很长时间才能完成,尽管我在本地运行服务器。 MongoDB本身是否支持某些功能?喜欢保存新文档,只插入新字段而不删除旧数据?这应该像倒置索引一样工作。
答案 0 :(得分:0)
您可以使用InsertBatch函数来达到此效果。 这是一个小例子:
List<BsonDocument> batch = new List<BsonDocument>();
var collection = _LocalDB.GetCollection<HashEntry>("Files");
foreach (var item in HashList)
{
var filter = Builders<HashEntry>.Filter.Eq("Hash", item);
var result = collection.Find(filter).ToList();
if (result.Count==0)
{
var newHash = new HashEntry();
newHash.FileList = new List<FileMetadata>();
newHash.Hash = item;
newHash.FileList.Add(inputFile);
batch.Add(newHash.ToBson());
}
else
{
var update = Builders<HashEntry>.Update.Push("FileList",inputFile);
collection.FindOneAndUpdate(filter,update);
}
}
collection.InsertBatch(batch.ToArray());
这将在步骤中插入所有HashEntry。它要快得多