MongoDB如何插入一批文档并忽略重复的文档c#

MongoDB如何插入一批文档并忽略重复的文档c#,c#,mongodb,C#,Mongodb,我想插入一批文档,其中一些已经存在于集合中。因此,我想要的是忽略它们,或者对我来说更好的解决方案是记录哪个文档是重复的,如果可能的话,继续插入下一个文档 我看到了两个类似的问题,但没有一个能解决这个问题 我已经创建了自己的散列属性,因为文档的唯一键是多个键,所以我将它们累加起来,然后计算散列 我的代码如下所示: const string connectionString = "mongodb://127.0.0.1/localdb"; var client

我想插入一批文档,其中一些已经存在于集合中。因此,我想要的是忽略它们,或者对我来说更好的解决方案是记录哪个文档是重复的,如果可能的话,继续插入下一个文档

我看到了两个类似的问题,但没有一个能解决这个问题

我已经创建了自己的散列属性,因为文档的唯一键是多个键,所以我将它们累加起来,然后计算散列

我的代码如下所示:

        const string connectionString = "mongodb://127.0.0.1/localdb";

        var client = new MongoClient(connectionString);

        _database = client.GetDatabase("localdb");

        var collection = _database.GetCollection<BsonDocument>("Sales");


StringBuilder customValue;

        foreach (var data in dataCollectionDict)
        {
            customValue = new StringBuilder();

            customValue.Append(data["col1"]);
            customValue.Append(data["col2"]);
            customValue.Append(data["col3"]);
            customValue.Append(data["col4"]);
            customValue.Append(data["col5"]);
            customValue.Append(data["col6"]);

            data.AddRange(new BsonDocument("HashMultipleKey", SHA256Func(customValue.ToString())));
        }


await collection.Indexes.CreateOneAsync(new BsonDocument("HashMultipleKey", 1), new CreateIndexOptions() { Unique = true, Sparse = true ,});


await collection.InsertManyAsync(dataCollectionDict);
const string connectionString=”mongodb://127.0.0.1/localdb";
var客户端=新的MongoClient(connectionString);
_database=client.GetDatabase(“localdb”);
var collection=_database.GetCollection(“销售”);
StringBuilder自定义值;
foreach(dataCollectionDict中的var数据)
{
customValue=新的StringBuilder();
附加(数据[“col1]”);
附加(数据[“col2]”);
附加(数据[“col3]”);
附加(数据[“col4]”);
附加(数据[“col5]”);
附加(数据[“col6”]);
AddRange(新的BsonDocument(“HashMultipleKey”,SHA256Func(customValue.ToString()));
}
wait collection.index.CreateOneAsync(新的BsonDocument(“HashMultipleKey”,1),新的CreateIndexOptions(){Unique=true,Sparse=true,});
wait collection.InsertManyAsync(dataCollectionDict);

任何帮助都将不胜感激。

这是我找到的解决方案,我不确定这是否是最好的解决方案,我很想听听您是否有更好的解决方法

      try
        {
            await collection.InsertManyAsync(dataCollectionDict);
        }
        catch (Exception ex)
        {
            ApplicationInsights.Instance.TrackException(ex);

            InsertSingleDocuments(dataCollectionDict,collection, dataCollectionQueueMessage);
        }
    }

    private static void InsertSingleDocuments(List<BsonDocument> dataCollectionDict, IMongoCollection<BsonDocument> collection
        ,DataCollectionQueueMessage dataCollectionQueueMessage)
    {
        ApplicationInsights.Instance.TrackEvent("About to start insert individual docuemnts and to find the duplicate one");

        foreach (var data in dataCollectionDict)
        {
            try
            {
                collection.InsertOne(data);
            }
            catch (Exception ex)
            {
                ApplicationInsights.Instance.TrackException(ex,new Dictionary<string, string>() {
                    {
                        "Error Message","Duplicate document was detected, therefore ignoring this document and continuing to insert the next docuemnt"
                    }, {
                        "FilePath",dataCollectionQueueMessage.FilePath
                    }}
                );
            }
        }
    }
试试看
{
wait collection.InsertManyAsync(dataCollectionDict);
}
捕获(例外情况除外)
{
ApplicationInsights.Instance.TrackException(ex);
InsertSingleDocuments(dataCollectionDict、collection、dataCollectionQueueMessage);
}
}
私有静态void InsertSingleDocuments(列表dataCollectionDict、IMongoCollection集合
,DataCollectionQueueMessage DataCollectionQueueMessage)
{
ApplicationInsights.Instance.TrackEvent(“即将开始插入单个文档并查找重复文档”);
foreach(dataCollectionDict中的var数据)
{
尝试
{
收集:InsertOne(数据);
}
捕获(例外情况除外)
{
ApplicationInsights.Instance.TrackException(例如,new Dictionary(){
{
“错误消息”,“检测到重复文档,因此忽略此文档并继续插入下一个文档”
}, {
“文件路径”,dataCollectionQueueMessage.FilePath
}}
);
}
}
}