C#和MongoDB - 优化的批量插入和更新

时间:2017-03-07 13:48:01

标签: c# mongodb

我有以下对象

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本身是否支持某些功能?喜欢保存新文档,只插入新字段而不删除旧数据?这应该像倒置索引一样工作。

1 个答案:

答案 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。它要快得多