本教程創(chuàng)建對(duì) MongoDB NoSQL 數(shù)據(jù)庫(kù)執(zhí)行創(chuàng)建、讀取、更新和刪除 (CRUD) 操作的 Web API。
在本教程中,你將了解:
- 配置 MongoDB
- 創(chuàng)建 MongoDB 數(shù)據(jù)庫(kù)
- 定義 MongoDB 集合和架構(gòu)
- 從 Web API 執(zhí)行 MongoDB CRUD 操作
查看或下載示例代碼(如何下載)
系統(tǒng)必備
配置 MongoDB
如果使用的是 Windows,MongoDB 將默認(rèn)安裝在 C:\Program Files\MongoDB 中。 將 C:\Program Files\MongoDB\Server\<version_number>\bin 添加到 Path 環(huán)境變量中。 通過(guò)此更改可以從開發(fā)計(jì)算機(jī)上的任意位置訪問(wèn) MongoDB。
使用以下步驟中的 mongo Shell 可以創(chuàng)建數(shù)據(jù)庫(kù)、創(chuàng)建集合和存儲(chǔ)文檔。 有關(guān) mongo Shell 命令的詳細(xì)信息,請(qǐng)參閱使用 mongo Shell。
- 選擇開發(fā)計(jì)算機(jī)上用于存儲(chǔ)數(shù)據(jù)的目錄。 例如,Windows 上的 C:\BooksData。 創(chuàng)建目錄(如果不存在)。 mongo Shell 不會(huì)創(chuàng)建新目錄。
- 打開命令行界面。 運(yùn)行以下命令以連接到默認(rèn)端口 27017 上的 MongoDB。 請(qǐng)記得將 <data_directory_path> 替換為上一步中選擇的目錄。console復(fù)制mongod --dbpath <data_directory_path>
- 打開另一個(gè)命令行界面實(shí)例。 通過(guò)運(yùn)行以下命令來(lái)連接到默認(rèn)測(cè)試數(shù)據(jù)庫(kù):console復(fù)制mongo
- 在命令行界面中運(yùn)行下面的命令:console復(fù)制use BookstoreDb
如果該命令尚不存在,則將創(chuàng)建名為 BookstoreDb 的數(shù)據(jù)庫(kù)。 如果該數(shù)據(jù)庫(kù)存在,則將為事務(wù)打開其連接。
- 使用以下命令創(chuàng)建 Books 集合:console復(fù)制db.createCollection('Books')
顯示以下結(jié)果:console復(fù)制{ "ok" : 1 }
- 使用以下命令定義 Books 集合的架構(gòu)并插入兩個(gè)文檔:console復(fù)制db.Books.insertMany([{'Name':'Design Patterns','Price':54.93,'Category':'Computers','Author':'Ralph Johnson'}, {'Name':'Clean Code','Price':43.15,'Category':'Computers','Author':'Robert C. Martin'}])
顯示以下結(jié)果:console復(fù)制{
"acknowledged" : true,
"insertedIds" : [
ObjectId("5bfd996f7b8e48dc15ff215d"),
ObjectId("5bfd996f7b8e48dc15ff215e")
]
}
- 使用以下命令查看數(shù)據(jù)庫(kù)中的文檔:console復(fù)制db.Books.find({}).pretty()
顯示以下結(jié)果:console復(fù)制{
"_id" : ObjectId("5bfd996f7b8e48dc15ff215d"),
"Name" : "Design Patterns",
"Price" : 54.93,
"Category" : "Computers",
"Author" : "Ralph Johnson"
}
{
"_id" : ObjectId("5bfd996f7b8e48dc15ff215e"),
"Name" : "Clean Code",
"Price" : 43.15,
"Category" : "Computers",
"Author" : "Robert C. Martin"
}
該架構(gòu)將為每個(gè)文檔添加類型 ObjectId 的自動(dòng)生成的 _id 屬性。
數(shù)據(jù)庫(kù)可供使用了。 你可以開始創(chuàng)建 ASP.NET Core Web API。
創(chuàng)建 ASP.NET Core Web API 項(xiàng)目
轉(zhuǎn)到“文件” > “新建” > “項(xiàng)目”。
選擇“ASP.NET Core Web 應(yīng)用程序”,將項(xiàng)目命名為“BooksApi”,然后單擊“確定”。
選擇“.NET Core”目標(biāo)框架和“ASP.NET Core 2.2”。 選擇“API”項(xiàng)目模板,然后單擊“確定”:
訪問(wèn) NuGet 庫(kù):MongoDB.Driver 來(lái)確定適用于 MongoDB 的 .NET 驅(qū)動(dòng)程序的最新穩(wěn)定版本。 在“包管理器控制臺(tái)”窗口中,導(dǎo)航到項(xiàng)目根。 運(yùn)行以下命令以安裝適用于 MongoDB 的 .NET 驅(qū)動(dòng)程序:
PowerShell
Install-Package MongoDB.Driver -Version {VERSION}
添加模型
- 將 Models 目錄添加到項(xiàng)目根。
- 使用以下代碼將 Book 類添加到 Models 目錄:C#復(fù)制using MongoDB.Bson;
using MongoDB.Bson.Serialization.Attributes;
namespace BooksApi.Models
{
public class Book
{
[BsonId]
[BsonRepresentation(BsonType.ObjectId)]
public string Id { get; set; }
[BsonElement("Name")]
public string BookName { get; set; }
[BsonElement("Price")]
public decimal Price { get; set; }
[BsonElement("Category")]
public string Category { get; set; }
[BsonElement("Author")]
public string Author { get; set; }
}
}
在前面的類中,Id屬性:
- 需要在將公共語(yǔ)言運(yùn)行時(shí) (CLR) 對(duì)象映射到 MongoDB 集合時(shí)使用。
- 使用 [BsonId] 進(jìn)行批注,以將此屬性指定為文檔的主鍵。
- 使用 [BsonRepresentation(BsonType.ObjectId)] 進(jìn)行批注,以允許將參數(shù)作為類型 string而非 ObjectId 傳遞。 Mongo 處理從 string 到 ObjectId 的轉(zhuǎn)換。
類中的其他屬性使用 [BsonElement] 屬性進(jìn)行批注。 該屬性的值表示 MongoDB 集合中的屬性名稱。
添加 CRUD 操作類
- 將 Services 目錄添加到項(xiàng)目根。
- 使用以下代碼將 BookService 類添加到 Services 目錄:C#復(fù)制using System.Collections.Generic;
using System.Linq;
using BooksApi.Models;
using Microsoft.Extensions.Configuration;
using MongoDB.Driver;
namespace BooksApi.Services
{
public class BookService
{
private readonly IMongoCollection<Book> _books;
public BookService(IConfiguration config)
{
var client = new MongoClient(config.GetConnectionString("BookstoreDb"));
var database = client.GetDatabase("BookstoreDb");
_books = database.GetCollection<Book>("Books");
}
public List<Book> Get()
{
return _books.Find(book => true).ToList();
}
public Book Get(string id)
{
return _books.Find<Book>(book => book.Id == id).FirstOrDefault();
}
public Book Create(Book book)
{
_books.InsertOne(book);
return book;
}
public void Update(string id, Book bookIn)
{
_books.ReplaceOne(book => book.Id == id, bookIn);
}
public void Remove(Book bookIn)
{
_books.DeleteOne(book => book.Id == bookIn.Id);
}
public void Remove(string id)
{
_books.DeleteOne(book => book.Id == id);
}
}
}
- 將 MongoDB 連接字符串添加到 appsettings.json:C#復(fù)制{
"ConnectionStrings": {
"BookstoreDb": "mongodb://localhost:27017"
},
"Logging": {
"IncludeScopes": false,
"Debug": {
"LogLevel": {
"Default": "Warning"
}
},
"Console": {
"LogLevel": {
"Default": "Warning"
}
}
}
}
將在 BookService 類構(gòu)造函數(shù)中訪問(wèn)前面的 BookstoreDb 屬性。
- 在 Startup.ConfigureServices 中,向依賴關(guān)系注入系統(tǒng)注冊(cè) BookService 類:C#復(fù)制public void ConfigureServices(IServiceCollection services)
{
services.AddScoped<BookService>();
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}
必須執(zhí)行前面的服務(wù)注冊(cè)才能支持消費(fèi)類中的構(gòu)造函數(shù)注入。
BookService 類使用以下 MongoDB.Driver 成員對(duì)數(shù)據(jù)庫(kù)執(zhí)行 CRUD 操作:
- MongoClient – 讀取執(zhí)行數(shù)據(jù)庫(kù)操作的服務(wù)器實(shí)例。 此類的構(gòu)造函數(shù)提供了 MongoDB 連接字符串:C#復(fù)制public BookService(IConfiguration config)
{
var client = new MongoClient(config.GetConnectionString("BookstoreDb"));
var database = client.GetDatabase("BookstoreDb");
_books = database.GetCollection<Book>("Books");
}
- IMongoDatabase – 表示用于執(zhí)行操作的 Mongo 數(shù)據(jù)庫(kù)。 本教程在界面上使用泛型 GetCollection<T>(collection) 方法來(lái)獲取對(duì)特定集合中的數(shù)據(jù)的訪問(wèn)。 調(diào)用此方法后,可以對(duì)集合執(zhí)行 CRUD 操作。 在 GetCollection<T>(collection) 方法調(diào)用中:collection 表示集合名稱。T 表示存儲(chǔ)在集合中的 CLR 對(duì)象類型。
GetCollection<T>(collection) 返回 MongoCollection 對(duì)象,該對(duì)象表示集合。 在本教程中,對(duì)集合調(diào)用以下方法:
- Find<T> – 返回集合中與提供的搜索條件匹配的所有文檔。
- InsertOne – 插入提供的對(duì)象作為集合中的新文檔。
- ReplaceOne – 將與提供的搜索條件匹配的單個(gè)文檔替換為提供的對(duì)象。
- DeleteOne – 刪除與提供的搜索條件匹配的單個(gè)文檔。
添加控制器
- 使用以下代碼將 BooksController 類添加到 Controllers 目錄:C#復(fù)制using System.Collections.Generic;
using BooksApi.Models;
using BooksApi.Services;
using Microsoft.AspNetCore.Mvc;
namespace BooksApi.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class BooksController : ControllerBase
{
private readonly BookService _bookService;
public BooksController(BookService bookService)
{
_bookService = bookService;
}
[HttpGet]
public ActionResult<List<Book>> Get()
{
return _bookService.Get();
}
[HttpGet("{id:length(24)}", Name = "GetBook")]
public ActionResult<Book> Get(string id)
{
var book = _bookService.Get(id);
if (book == null)
{
return NotFound();
}
return book;
}
[HttpPost]
public ActionResult<Book> Create(Book book)
{
_bookService.Create(book);
return CreatedAtRoute("GetBook", new { id = book.Id.ToString() }, book);
}
[HttpPut("{id:length(24)}")]
public IActionResult Update(string id, Book bookIn)
{
var book = _bookService.Get(id);
if (book == null)
{
return NotFound();
}
_bookService.Update(id, bookIn);
return NoContent();
}
[HttpDelete("{id:length(24)}")]
public IActionResult Delete(string id)
{
var book = _bookService.Get(id);
if (book == null)
{
return NotFound();
}
_bookService.Remove(book.Id);
return NoContent();
}
}
}
前面的 Web API 控制器:使用 BookService 類執(zhí)行 CRUD 操作。包含操作方法以支持 GET、POST、PUT 和 DELETE HTTP 請(qǐng)求。CreatedAtRoute 方法返回 201 響應(yīng),這是在服務(wù)器上創(chuàng)建新資源的 HTTP POST 方法的標(biāo)準(zhǔn)響應(yīng)。 CreatedAtRoute 還會(huì)向響應(yīng)添加位置標(biāo)頭。 位置標(biāo)頭指定新建的待辦事項(xiàng)的 URI。 請(qǐng)參閱 10.2.2 201 已創(chuàng)建。
- 生成并運(yùn)行應(yīng)用。
- 在瀏覽器中導(dǎo)航到 http://localhost:<port>/api/books。 將顯示下面的 JSON 響應(yīng):JSON復(fù)制[
{
"id":"5bfd996f7b8e48dc15ff215d",
"bookName":"Design Patterns",
"price":54.93,
"category":"Computers",
"author":"Ralph Johnson"
},
{
"id":"5bfd996f7b8e48dc15ff215e",
"bookName":"Clean Code",
"price":43.15,
"category":"Computers",
"author":"Robert C. Martin"
}
]
更多建議: