using Dpz.Core.Entity.Base;
using Dpz.Core.Entity.Base.Image;
using Dpz.Core.Entity.Base.Indexes;

namespace Dpz.Core.Public.Entity;

[BsonIgnoreExtraElements]
public class Article : BaseEntity, IIndexedEntity<Article>
{
    /// <summary>
    /// 文章标题
    /// </summary>
    public required string Title { get; set; }

    /// <summary>
    /// 简介
    /// </summary>
    public string? Introduction { get; set; }

    /// <summary>
    /// Markdown 内容
    /// </summary>
    public required string Markdown { get; set; }

    /// <summary>
    /// 主图片
    /// </summary>
    public string? MainImage { get; set; }

    /// <summary>
    /// 主图片元信息
    /// <see cref="Article.MainImage"/>后续将会废弃
    /// </summary>
    public ImageMetadata? MainImageMetadata { get; set; }

    /// <summary>
    /// 回复量
    /// </summary>
    public int CommentCount { get; set; }

    /// <summary>
    /// 查看量
    /// </summary>
    public int ViewCount { get; set; }

    /// <summary>
    /// 文章相关图片地址
    /// </summary>
    public List<string> ImagesAddress { get; set; } = [];

    /// <summary>
    /// 文章相关图片的元信息
    /// <see cref="Article.MainImage"/>后续将会废弃
    /// </summary>
    public List<ImageMetadata> Images { get; set; } = [];

    /// <summary>
    /// 标签
    /// </summary>
    public List<string> Tags { get; set; } = [];

    /// <summary>
    /// 作者
    /// </summary>
    public required UserInfo Author { get; set; }

    /// <summary>
    /// 来源
    /// </summary>
    public string? From { get; set; }

    /// <summary>
    /// 发表时间
    /// </summary>
    [BsonDateTimeOptions(Kind = DateTimeKind.Local)]
    public DateTime CreateTime { get; set; }

    /// <summary>
    /// 最后修改时间
    /// </summary>
    [BsonDateTimeOptions(Kind = DateTimeKind.Local)]
    public DateTime LastUpdateTime { get; set; }

    /// <summary>
    /// 分类
    /// </summary>
    public List<string> Categories { get; set; } = [];

    /// <summary>
    /// 广告权重
    /// </summary>
    public double AdWeight { get; set; }

    /// <inheritdoc />
    public static IReadOnlyList<EntityIndexDefinition> GetIndexDefinitions() =>
        [
            new() { Fields = [EntityIndexField.Ascending("Author._id")] },
            new() { Fields = [EntityIndexField.Ascending<Article>(x => x.CreateTime)] },
            new() { Fields = [EntityIndexField.Descending<Article>(x => x.Tags)] },
            new() { Fields = [EntityIndexField.Ascending<Article>(x => x.Tags)] },
            new() { Fields = [EntityIndexField.Ascending<Article>(x => x.Title)] },
            new() { Fields = [EntityIndexField.Ascending<Article>(x => x.From)] },
            new()
            {
                Fields =
                [
                    EntityIndexField.Text<Article>(x => x.Markdown),
                    EntityIndexField.Text<Article>(x => x.Title),
                ],
                DefaultLanguage = "english",
                TextWeights = new Dictionary<string, int>
                {
                    [nameof(Markdown)] = 1,
                    [nameof(Title)] = 1,
                },
            },
        ];
}
⚠⚠    以下内容为AI分析的结果,请根据实际情况进行判断。

代码解释

这是一个使用 C# 编写的 文章实体类 (Article Entity),用于表示博客或内容管理系统中的文章数据模型。该类使用 MongoDB 作为数据存储,并包含索引定义。

主要组成部分

1. 类声明

[BsonIgnoreExtraElements]
public class Article : BaseEntity, IIndexedEntity<Article>
  • [BsonIgnoreExtraElements]: MongoDB 序列化特性,忽略数据库中存在但类中未定义的额外字段
  • 继承 BaseEntity: 基础实体类(可能包含 Id、状态等通用字段)
  • 实现 IIndexedEntity<Article>: 表示该实体支持自定义索引定义

2. 核心属性

属性类型说明
Titlestring (required)文章标题(必填)
Introductionstring?文章简介(可选)
Markdownstring (required)Markdown 格式的正文内容(必填)
MainImagestring?主图片地址(将废弃)
MainImageMetadataImageMetadata?主图片元信息(新版本)
CommentCountint评论数量
ViewCountint浏览次数
ImagesAddressList文章相关图片地址列表(将废弃)
ImagesList文章图片元信息列表(新版本)
TagsList标签列表
AuthorUserInfo (required)作者信息(必填)
Fromstring?来源
CreateTimeDateTime创建时间(本地时区)
LastUpdateTimeDateTime最后更新时间(本地时区)
CategoriesList分类列表
AdWeightdouble广告权重

3. 索引定义 (GetIndexDefinitions)

该方法返回 MongoDB 数据库索引配置:

// 作者ID升序索引
Author._id (Ascending)

// 创建时间升序索引
CreateTime (Ascending)

// 标签降序索引
Tags (Descending)

// 标签升序索引
Tags (Ascending)

// 标题升序索引
Title (Ascending)

// 来源升序索引
From (Ascending)

// 全文搜索索引(复合)
Text Index: Markdown + Title
- 默认语言: English
- 权重: Markdown=1, Title=1

设计特点

  1. 数据迁移兼容: 同时保留旧字段 (MainImage, ImagesAddress) 和新字段 (MainImageMetadata, Images),便于平滑迁移

  2. 性能优化: 通过多个索引支持常见查询场景(按作者、时间、标签、全文搜索等)

  3. 本地化时间: 使用 [BsonDateTimeOptions(Kind = DateTimeKind.Local)] 确保时间以本地时区存储

  4. 全文搜索: 支持对 Markdown 内容和标题进行全文检索

  5. 必填字段约束: 使用 required 关键字强制要求必须初始化关键字段(C# 11+ 特性)

这是一个设计良好、考虑了实际业务需求和性能优化的文章数据模型。

评论加载中...