.NET 云原生架构师训练营(模块二 基础巩固 MongoDB 问答系统)--学习笔记
2.5.6 MongoDB -- 问答系统
- MongoDB 数据库设计
- API 实现概述
MongoDB 数据库设计
设计优化
- 内嵌(mongo)还是引用(mysql)
- 数据一致性
范式:将数据分散到不同的集合;反范式:使用内嵌文档
在范式化的情况下需要在进行多次查询再拼装数据,或者使用 lookup,即跨表查询;反范式化的情况下可以直接查出相关数据
| 更适合内嵌 | 更适合引用 |
|---|---|
| 子文档较小 | 子文档较大 |
| 数据不会定期改变 | 数据经常改变 |
| 最终数据一致即可 | 中间阶段数据必须一致 |
| 文档数据小幅增加 | 文档数据大幅增加 |
| 数据通过需要执行二次查询才能获得 | 数据通常不包含在结果中 |
| 快速读取 | 快速写入 |
需求
- 查询所有问题(根据标签查询,按发布时间,浏览数量、投票数量、降序排序)
- 创建问题,回答问题
- 对问题投票,对答案投票
- 对问题添加评论,对答案添加评论
- 对问题进行修改,对答案进行修改
- 我投过票的问题,我投过票的答案
- 我浏览过的问题
- 我回答的问题列表
API 实现概述
postman 文档:https://documenter.getpostman.com/view/4874930/TVYM3F2M#4e7e4e11-c424-41ce-a463-3d1995a78ff8
| api | name |
|---|---|
| GET /api/question | 查询问题列表 |
| GET /api/question/{id} | 查询单个问题 |
| GET /api/question/{id}/answers | 查询单个问题带答案 |
| POST /api/question | 创建问题 |
| PATCH /api/question/{id} | 修改问题 |
| POST /api/question/{id}/answer | 回答问题/添加答案 |
| POST /api/question/{id}/up | 向上投票问题 |
| POST /api/question/{id}/down | 向下投票问题 |
| POST /api/question/{id}/comment | 添加问题评论 |
| GET /api/answer | 查询答案 |
| POST /api/answer/{id}/up | 向上投票答案 |
| POST /api/answer/{id}/down | 向下投票答案 |
| PATCH /api/answer/{id} | 修改答案 |
| POST /api/answer/{id}/comment | 添加答案评论 |
创建文档类
- question
- answer
- vote
- comment
- view
namespace LighterApi.Data.Question
{
public class Question : Entity
{
public String ProjectId { get; set; }
public string Title { get; set; }
public string Content { get; set; }
public List<string> Tags { get; set; } = new List<string>();
public int ViewCount { get; set; }
public int VoteCount { get; set; }
public List<string> VoteUps { get; set; } = new List<string>();
public List<string> VoteDowns { get; set; } = new List<string>();
public List<string> Answers { get; set; } = new List<string>();
public List<Comment> Comments { get; set; } = new List<Comment>();
}
}
namespace LighterApi.Data.Question
{
public class Answer : Entity
{
public string QuestionId { get; set; }
public string Content { get; set; }
public int VoteCount { get; set; }
public List<string> VoteUps { get; set; } = new List<string>();
public List<string> VoteDowns { get; set; } = new List<string>();
public List<Comment> Comments { get; set; } = new List<Comment>();
}
}
namespace LighterApi.Data.Question
{
public class Vote : Entity
{
public string SourceType { get; set; }
public string SourceId { get; set; }
public EnumVoteDirection Direction { get; set; }
}
}
namespace LighterApi.Data.Question
{
public class Comment
{
public string Content { get; set; }
public DateTime CreatedAt { get; set; }
public string CreatedBy { get; set; }
}
}
namespace LighterApi.Data.Question
{
public class View : Entity
{
public string QuestionId { get; set; }
}
}
namespace LighterApi.Share
{
public class ConstVoteSourceType
{
public const string Question = "question";
public const string Answer = "answer";
}
}
namespace LighterApi.Share
{
public enum EnumVoteDirection
{
Up = 1,
Down = 0,
}
}
集成 mongo db driven
- 安装 nuget 包
- 服务注入 IMongoClient
- 连接字符串
安装 nuget 包
dotnet package install MongoDB.Driver
服务注入 IMongoClient
Startup
services.AddSingleton<IMongoClient>(sp =>
{
return new MongoClient(Configuration.GetConnectionString("LighterMongoServer"));
});
appsettings.json
"LighterMongoServer": "mongodb://127.0.0.1"
连接字符串
连接到单个实例,默认127.0.0.1:27017
var client = new MongoClient();
指定一个连接字符串
var client = new MongoClient("mongodb://localhost:27017");
指写带密码的连接字符串
var client = new MongoClient("mongodb://admin:password@localhost:27017");
连接到一个副本集,客户端服务发现
var client = new MongoClient("mongodb://localhost:27017,localhost:27018,localhost:27019"
GitHub源码链接:
https://github.com/MINGSON666/Personal-Learning-Library/tree/main/ArchitectTrainingCamp/LighterApi

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
欢迎转载、使用、重新发布,但务必保留文章署名 郑子铭 (包含链接: http://www.cnblogs.com/MingsonZheng/ ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。
如有任何疑问,请与我联系 (MingsonZheng@outlook.com) 。
.NET 云原生架构师训练营(模块二 基础巩固 MongoDB 问答系统)--学习笔记的更多相关文章
- .NET 云原生架构师训练营(设计原则与模式)--学习笔记
在复杂系统的架构设计中引入设计原则与模式,能够极大降低复杂系统开发.和维护的成本 目录 几个问题 为什么要学习设计模式 优良架构设计的具体指标 理解复杂系统 面向对象思想(指导复杂系统的分析.设计.实 ...
- .NET 云原生架构师训练营(权限系统 代码重构)--学习笔记
目录 模块拆分 代码重构 模块拆分 代码重构 AuthenticationController PermissionController IAuthorizationMiddlewareResultH ...
- .NET 云原生架构师训练营(KestrelServer源码分析)--学习笔记
目录 目标 源码 目标 理解 KestrelServer 如何接收网络请求,网络请求如何转换成 http request context(C# 可识别) 源码 https://github.com/d ...
- .NET 云原生架构师训练营(模块一 架构师与云原生)--学习笔记
目录 什么是软件架构 软件架构的基本思路 单体向分布式演进.云原生.技术中台 1.1 什么是软件架构 1.1.1 什么是架构? Software architecture = {Elements, F ...
- .NET 云原生架构师训练营(建立系统观)--学习笔记
目录 目标 ASP .NET Core 什么是系统 什么是系统思维 系统分解 什么是复杂系统 作业 目标 通过整体定义去认识系统 通过分解去简化对系统的认识 ASP .NET Core ASP .NE ...
- .NET 云原生架构师训练营(权限系统 RGCA 架构设计)--学习笔记
目录 项目核心内容 实战目标 RGCA 四步架构法 项目核心内容 无代码埋点实现对所有 API Action 访问控制管理 对 EF Core 实体新增.删除.字段级读写控制管理 与 Identity ...
- .NET 云原生架构师训练营(模块二 基础巩固 敏捷开发)--学习笔记
2.7.1 敏捷开发 敏捷介绍 敏捷的起源 敏捷软件开发宣言 敏捷开发十二原则 生命周期对比 敏捷开发的特点 敏捷的发展 敏捷的核心 敏捷的起源 2001年,17个老头子在一起一边滑雪,一边讨论工作, ...
- .NET 云原生架构师训练营(模块二 基础巩固 MongoDB 介绍和基础)--学习笔记
2.5.1 MongoDB -- 介绍 mysql vs mongo 快速开始 mysql vs mongo 对比 mysql mongo 数据存储 table 二维表结构,需要预先定义结构 json ...
- .NET 云原生架构师训练营(模块二 基础巩固 Scrum 团队)--学习笔记
2.7.3 Scrum 团队 理想的环境 团队章程 如何组建 Scrum 团队 产品待办事项列表 用户故事 敏捷开发流程 理想的环境 5-9人 100% 跨职能 在一起 自组织 自组织 目标 授权 沟 ...
随机推荐
- 第3.5节 丰富的Python字典操作
一. 基本概念 Python提供一种通过名称来访问其各个值的数据结构,这种数据结构称为映射(mapping).字典(dict)是Python中唯一的内置映射类型,其中的值不按顺序排列,而是存储在键下, ...
- Mysql 存储过程(变量、定义条件、处理程序、光标、流程控制构造)
最近由于有同事编写了存储函数,需要进行验证,但是对存储过程一直不是很了解,所以抽时间了解了一下存储过程的基本语法.本篇文章主要包括介绍了存储过程的5个小语法:declare语句的变量.定义条件.处理程 ...
- ❤空植发队 影评网站FilmReviewWeb-团队介绍
空植发队 团队展示&选题 团队展示 团队信息 队名: 空植发队 队员: 罗泉水(队长)3118005101 麦狄龙 3118005103 马志鹏 3118005102 陈鸿畅 3118 ...
- 查询时间倒退一天-项目中惊现神秘BUG-JsonFormat使用采坑记
一.问题由来 前一天下午正在写代码的时候,领导突然走过来跟我说,让我去看一个神秘的BUG,说是在数据库中查询时的一个日期 返回到页面后,查询时间倒退了一天.一听到这个BUG,我就感觉很奇怪,还有这样的 ...
- 微信端video去除最顶层播放
https://x5.tencent.com/tbs/guide/video.html 给video标签添加属性 x5-video-player-type="h5"
- MVCAdmin项目知识点记录
1.在过滤器中,用ViewBag类似的东西,要((ViewResult)filterContext.Result).ViewBag. 2.Controller中自己定义的非Action方法中(包括构造 ...
- logstash导入DNS解析数据到es中,中间有filebeat
这个过程中,主要用logstash处理数据的时候不好处理. 在logstash-sample.conf这个配置文件中的配置,我用这个监控filebeat的5044端口 # Sample Logstas ...
- C++异常之六 异常处理的基本思想
异常处理的基本思想 C++的异常处理机制使得异常的引发和异常的处理不必在同一个函数中,这样低沉的函数可以着重解决具体问题,而不必过多的考虑异常的处理.上层调用者可以再适当的位置设计对不同类型异常的处理 ...
- RocketMQ集群搭建(3m-3s-async)
RocketMQ集群搭建(3m-3s-async) 各角色介绍 角色 作用 Producer 消息发送者,将消息发送到 Broker.无状态,其与NameServer集群中的一个节点建立长连接,定期从 ...
- vue第七单元(vue的单文件组件形式-单文件组件的加载原理-vue-cli构建的开发环境以及生命周期)
第七单元(vue的单文件组件形式-单文件组件的加载原理-vue-cli构建的开发环境以及生命周期) #课程目标 掌握安装 vue-cli 命令行工具的方法,掌握使用命令行在本地搭建开发环境,使用命令行 ...