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
}}
);
}
}
}