Skip to content

Commit

Permalink
fix (#555)
Browse files Browse the repository at this point in the history
  • Loading branch information
joesdu authored Sep 26, 2024
2 parents dc1c0e1 + 6e0d234 commit 7b36d7c
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 2 deletions.
9 changes: 9 additions & 0 deletions src/EasilyNET.Mongo.AspNetCore/MongoExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,11 @@ public static class MongoExtensions
{
private static readonly ConcurrentDictionary<string, bool> CollectionCache = new();

/// <summary>
/// 不要尝试创建名称为 system.profile 的时间序列集合或视图。如果您尝试这样做,MongoDB 6.3 及更高版本会返回 IllegalOperation 错误。早期 MongoDB 版本会因此崩溃。
/// </summary>
private const string IllegalName = "system.profile";

/// <summary>
/// 对标记TimeSeriesCollectionAttribute创建MongoDB的时序集合
/// </summary>
Expand All @@ -39,6 +44,10 @@ private static void EnsureTimeSeriesCollections(IMongoDatabase database)
{
var attribute = type.GetCustomAttributes<TimeSeriesCollectionAttribute>(false).First();
var collectionName = type.Name;

if (IllegalName.Equals(collectionName.ToLowerInvariant()))
continue;

CollectionCache.TryGetValue(collectionName, out var value);
// 如果缓存中存在且为true,跳过创建
if (value) continue;
Expand Down
16 changes: 14 additions & 2 deletions src/EasilyNET.Mongo.Core/TimeSeriesCollectionAttribute.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ namespace EasilyNET.Mongo.Core;

/// <summary>
/// 标记为时序集合
/// https://www.mongodb.com/zh-cn/docs/rapid/core/timeseries/timeseries-procedures/
/// </summary>
[AttributeUsage(AttributeTargets.Class)]
public sealed class TimeSeriesCollectionAttribute : Attribute
Expand All @@ -16,18 +17,29 @@ public sealed class TimeSeriesCollectionAttribute : Attribute
/// <param name="timeField">用于时间的顶级字段的名称。</param>
/// <param name="metaField">描述相关数据分组所依据的系列的顶级字段的名称。</param>
/// <param name="granularity">表示MongoDB.Driver.TimeSeriesGranularity时间序列的粒度。如果使用bucketMaxSpanSeconds,则不设置</param>
public TimeSeriesCollectionAttribute(string timeField, string metaField, TimeSeriesGranularity granularity = TimeSeriesGranularity.Seconds)
{
TimeSeriesOptions = new(timeField, metaField, granularity, null, null);
}

/// <summary>
/// 标记为时序集合
/// </summary>
/// <param name="timeField">用于时间的顶级字段的名称。</param>
/// <param name="metaField">描述相关数据分组所依据的系列的顶级字段的名称。</param>
/// <param name="bucketMaxSpanSeconds">同一存储桶中时间戳之间的最大时间间隔。</param>
/// <param name="bucketRoundingSeconds">打开新存储桶时用于四舍五入第一个时间戳的间隔。</param>
public TimeSeriesCollectionAttribute(string timeField, string? metaField = default, TimeSeriesGranularity? granularity = default, int? bucketMaxSpanSeconds = default, int? bucketRoundingSeconds = default)
public TimeSeriesCollectionAttribute(string timeField, string metaField, int bucketMaxSpanSeconds, int bucketRoundingSeconds)
{
TimeSeriesOptions = new(timeField, metaField, granularity, bucketMaxSpanSeconds, bucketRoundingSeconds);
TimeSeriesOptions = new(timeField, metaField, null, bucketMaxSpanSeconds, bucketRoundingSeconds);
}

/// <summary>
/// 时间集合配置
/// </summary>
public TimeSeriesOptions TimeSeriesOptions { get; private set; }


/// <summary>
/// 可选。通过指定文档过期后的秒数,启用自动删除时间序列集合中文档的功能。MongoDB 自动删除过期文档。请参阅设置自动删除时间序列集合 (TTL),获取更多信息。
/// </summary>
Expand Down

0 comments on commit 7b36d7c

Please sign in to comment.