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. 核心属性
| 属性 | 类型 | 说明 |
|---|---|---|
Title | string (required) | 文章标题(必填) |
Introduction | string? | 文章简介(可选) |
Markdown | string (required) | Markdown 格式的正文内容(必填) |
MainImage | string? | 主图片地址(将废弃) |
MainImageMetadata | ImageMetadata? | 主图片元信息(新版本) |
CommentCount | int | 评论数量 |
ViewCount | int | 浏览次数 |
ImagesAddress | List | 文章相关图片地址列表(将废弃) |
Images | List | 文章图片元信息列表(新版本) |
Tags | List | 标签列表 |
Author | UserInfo (required) | 作者信息(必填) |
From | string? | 来源 |
CreateTime | DateTime | 创建时间(本地时区) |
LastUpdateTime | DateTime | 最后更新时间(本地时区) |
Categories | List | 分类列表 |
AdWeight | double | 广告权重 |
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
设计特点
数据迁移兼容: 同时保留旧字段 (
MainImage,ImagesAddress) 和新字段 (MainImageMetadata,Images),便于平滑迁移性能优化: 通过多个索引支持常见查询场景(按作者、时间、标签、全文搜索等)
本地化时间: 使用
[BsonDateTimeOptions(Kind = DateTimeKind.Local)]确保时间以本地时区存储全文搜索: 支持对 Markdown 内容和标题进行全文检索
必填字段约束: 使用
required关键字强制要求必须初始化关键字段(C# 11+ 特性)
这是一个设计良好、考虑了实际业务需求和性能优化的文章数据模型。
AI 正在分析代码…
评论加载中...