在 .NET 7 中使用 MongoDB 7 和 MongoDB.Driver 2.24.0
我有一个定义为时间序列的 MongoDB 集合,如果我只进行插入,则工作正常,但现在,记录可能会重复,我必须执行某种插入/更新。我搜索了一些更新插入的例子,但似乎在时间序列上发挥了错误,所以我最终这样做了
cTimeseries 是一个像这样的简单 C# 类
public class Ctimeseries {
[BsonId]
[BsonRepresentation(BsonType.ObjectId)]
public string? Id { get; set; }
/// <summary>
/// Date in format "2024-03-12T14:14:57.000Z"
/// </summary>
public DateTime timestamp { get; set; }// = new (0,0);
/// <summary>
/// string with an alfanumeric code
/// </summary>
public Metadata metadata { get; set; } = new Metadata();
/// <summary>
/// set of 8 measurements
/// </summary>
public double[] Measurements { get; set; }
/// <summary>
/// Summer Flag
/// </summary>
public byte Summer { get; set; }
/// <summary>
/// kind of measure, default 1
/// </summary>
public byte MeasureKind { get; set; } = 1;
/// <summary>
/// extra data 26 caracters
/// </summary>
public string Extradata { get; set; }
}
我当前的 upsert 实现是这样的
public async Task Upsert(List<Ctimeseries> records)
{
//queue all the deletes from incoming records and bulk delete/insert
List<DeleteOneModel<Ctimeseries>> requests = new List<DeleteOneModel<Ctimeseries>>(records.Count());
foreach (Ctimeseries record in records) {
var filter = new FilterDefinitionBuilder<Ctimeseries>().Where(m => m.timestamp == record.timestamp && m.metadata == record.metadata);
var request = new DeleteOneModel<Ctimeseries>(filter); //queue the delete
requests.Add(request);
}
await _CtimeseriesCol.BulkWriteAsync(requests); //perform bulk delete <- "flowControl": {"acquireCount": 2232},"durationMillis": 3748 1,67921146953405 ms per record
await _CtimeseriesCol.InsertManyAsync(records); //perform bulk insert <- "flowControl": {"acquireCount": 54133},"durationMillis": 92724 1,712892320765522 ms per record
}
这个数字并不是那么大。使用纯 insertmayasync,我在大约 5 分钟内插入了 9M 条记录。这样,1 小时后,我的插入量就超过 100 万了。
我在这里做额外的工作吗?我应该创建 Bson 文档以另一种方式调用 c# 驱动程序吗?
首先,我创建了 insertmany,并且工作得像做梦一样。之后,尝试了 MongoDb C# 驱动程序中的示例 - 根据“候选”键更新插入许多 但得到了 批量写入操作导致一个或多个错误。 WriteErrors: [ { Category : "Uncategorized", Code : 72, Message : "无法对时间序列集合执行非多重更新" } ].
致以诚挚的问候。
正如 @markus 所评论的那样,目前无法对时间序列执行此操作,因此我将返回到正常集合并添加版本标志。