C# MongoDB Timeseries 批量更新并插入重复记录

问题描述 投票:0回答:1

在 .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 : "无法对时间序列集合执行非多重更新" } ].

致以诚挚的问候。

c# mongodb time-series
1个回答
0
投票

正如 @markus 所评论的那样,目前无法对时间序列执行此操作,因此我将返回到正常集合并添加版本标志。

© www.soinside.com 2019 - 2024. All rights reserved.