话不多说,先了解一下MongoDB,在后端服务中选择一个数据库,是由最适合项目应用场景的架构决策所决定的。在做出决策前就需要了解和学习数据库的相关特性,从数据库官网学习了解它的特性是最适合不过的了。
MongoDB官方手册网站:MongoDB是什么? - 数据库手册 - MongoDB Docs
MongoDB .NET/C# 驱动程序手册网站:快速入门 - C#/.NET 驱动程序 v3.4 - MongoDB Docs
1、添加MongoDB.Driver
dotnet add package MongoDB.Driver
2、添加MongoDB配置信息到appsettings.json中
"MongoDBConfig": {
"BooksCollectionName": "Book",
"DatabaseName": "BookStoreDB",
"ConnectionString": "mongodb://localhost:27017/",
}
3、创建MongoDB配置信息类
public class MongoDBConfig
{
public string BookCollectionName { get; set; } = string.Empty;
public string DatabaseName { get; set; } = string.Empty;
public string ConnectionString { get; set; } = string.Empty;
}
4、创建实体类-Book
public class Book
{
[BsonId]
[BsonRepresentation(BsonType.ObjectId)]
public string Id { get; set; } = ObjectId.GenerateNewId().ToString();
[BsonElement("Name")]
public string BookName { get; set; } = string.Empty;
public decimal Price { get; set; }
public string Category { get; set; } = string.Empty;
public string Author { get; set; } = string.Empty;
[BsonDateTimeOptions(Kind = DateTimeKind.Local)]
public DateTime CreationTime { get; set; } = DateTime.Now;
}
注:[BsonDateTimeOptions(Kind = DateTimeKind.Local)]必须要添加的,因为MongoDB写入时间是协调世界时(UTC),不加这样注解,查询出来结果会有时区误差。
5、创建自定义MongoDB上下文
public class MongoDBContext
{
public IMongoCollection<Book> Books { get; }
public MongoDBContext(MongoDBConfig mongodbConfig)
{
if (mongodbConfig != null)
{
if (string.IsNullOrEmpty(mongodbConfig.ConnectionString))
throw new ArgumentException("MongoDB connection is not configured");
var client = new MongoClient(mongodbConfig.ConnectionString);
var database = client.GetDatabase(mongodbConfig.DatabaseName);
Books = database.GetCollection<User>(mongodbConfig.BookCollectionName);
}
else
{
throw new ArgumentNullException(nameof(mongodbConfig));
}
}
}
6、创建自定义MongoDB扩展注入服务
public static class MongoDBServiceExtensions
{
public static IServiceCollection AddMongoDB(this IServiceCollection services, IConfiguration configuration)
{
services.Configure<MongoDBConfig>(configuration.GetSection("MongoDBConfig"));
services.AddSingleton<MongoDBContext>(provider =>
{
var settings = configuration.GetSection("MongoDBConfig").Get<MongoDBConfig>();
return settings == null
? throw new InvalidOperationException("MongoDBConfig is not configured properly.")
: new MongoDBContext(settings);
});
return services;
}
}
注:这里为什么会将MongoDBContext注册为单例服务,因为官方文档推荐单例模式
7、Program.cs文件中注入MongoDB
builder.Services.AddMongoDB(builder.Configuration);
8、使用MongoDB
[ApiController]
[Route("api/[controller]")]
public class BookController : ControllerBase
{
private readonly ILogger<BookController> _logger;
private readonly MongoDBContext _mongodbContext;
public BookController(MongoDBContext mongodbContext, ILogger<BookController> logger)
{
_logger = logger;
_mongodbContext = mongodbContext;
}
[HttpGet]
public async Task<List<Book>> GetList()
{
return await _mongodbContext.Books.Find(_ => true).ToListAsync();
}
[HttpGet("{id:length(24)}")]
public async Task<ActionResult<Book>> Get(string id)
{
var book = await _mongodbContext.Books.Find(x => x.Id == id).FirstOrDefaultAsync();
if (book is null)
{
return NotFound();
}
return book;
}
[HttpPost]
public async Task<IActionResult> Post(Book newBook)
{
await _mongodbContext.Books.InsertOneAsync(newBook);
return CreatedAtAction(nameof(Get), new { id = newBook.Id }, newBook);
}
[HttpPut("{id:length(24)}")]
public async Task<IActionResult> Update(string id, Book updatedBook)
{
var book = await _mongodbContext.Books.Find(x => x.Id == id).FirstOrDefaultAsync();
if (book is null)
{
return NotFound();
}
updatedBook.Id = book.Id;
await _mongodbContext.Books.ReplaceOneAsync(x => x.Id == id, updatedBook); ;
return NoContent();
}
[HttpDelete("{id:length(24)}")]
public async Task<IActionResult> Delete(string id)
{
var book = await _mongodbContext.Books.Find(x => x.Id == id).FirstOrDefaultAsync();
if (book is null)
{
return NotFound();
}
await _mongodbContext.Books.DeleteOneAsync(x => x.Id == id);
return NoContent();
}
}