将 OData 与MongoDB结合使用
Overview
OData(开放数据协议)是一种标准化协议,用于构建和使用 RESTful API,允许使用HTTP请求查询和操作数据。它提供了一种统一的方式来公开多个来源的数据并交互。
在本教程中,您将学习;了解如何将 OData 与MongoDB应用程序集成。
样本数据
本教程使用sample_restaurants.restaurants
Atlas示例数据集中的 集合。要学习;了解如何创建免费的MongoDB Atlas 群集并加载示例数据集,请参阅 快速入门。
Tutorial
定义模型
在解决方案中创建一个名为 Models
的新文件夹,并将以下 Restaurant.cs
、Address.cs
和 GradeEntry.cs
文件复制到该文件夹中:
public class Restaurant { [ ] public string Id { get; set; } public string Name { get; set; } [ ] public string RestaurantId { get; set; } public string Cuisine { get; set; } public Address Address { get; set; } public string Borough { get; set; } public List<GradeEntry> Grades { get; set; } }
public class Address { public string Building { get; set; } [ ] public double[] Coordinates { get; set; } public string Street { get; set; } [ ] public string ZipCode { get; set; } }
public class GradeEntry { public DateTime Date { get; set; } public string Grade { get; set; } public float? Score { get; set; } }
注意
restaurants
集合中的文档使用蛇形命名规则。本指南中的示例使用 ConventionPack
将集合中的字段反序列化为 Pascal 语句,并将它们映射到 Restaurant
类中的属性。
如需了解有关自定义序列化的更多信息,请参阅“自定义序列化”。
创建 OData 控制器
在解决方案中创建一个名为 Controllers
的新文件夹,并添加一个名为 RestaurantsController.cs
的新控制器文件。将以下代码复制到该文件:
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.OData.Routing.Controllers; using MongoDB.AspNetCore.OData; using MongoDB.Driver; using ODataTest.Models; namespace ODataTest.Controllers; public class RestaurantsController : ODataController { private readonly IQueryable<Restaurant> _restaurants; public RestaurantsController(IMongoClient client) { var database = client.GetDatabase("sample_restaurants"); _restaurants = database.GetCollection<Restaurant>("restaurants") .AsQueryable(); } // Registers Get endpoint and sets max documents to 5 [ ] public ActionResult<IEnumerable<Restaurant>> Get() { return Ok(_restaurants); } }
此代码执行以下操作:
创建连接到MongoDB的构造函数,并获取
restaurants
集合。创建一个
Get
端点,用于返回集合中的所有餐厅。指定
MongoEnableQuery
属性以启用对Get
端点的查询。指定
MongoEnableQuery
的PageSize
属性,以将返回的文档数量限制为5
。
配置 OData 服务
将以下代码粘贴到 Program.cs
文件中,以配置 OData 服务并映射控制器端点。
using Microsoft.AspNetCore.OData; using Microsoft.OData.ModelBuilder; using MongoDB.Bson.Serialization.Conventions; using MongoDB.Driver; using ODataTest.Models; var builder = WebApplication.CreateBuilder(args); // Registers a convention pack to convert fields to camel case var camelCaseConvention = new ConventionPack { new CamelCaseElementNameConvention() }; ConventionRegistry.Register( "CamelCase", camelCaseConvention, type => true); builder.Services.AddSingleton<IMongoClient>( new MongoClient("<Your connection URI>")); // Registers the Restaurants entity and sets the Id field as the key var modelBuilder = new ODataConventionModelBuilder(); modelBuilder.EntitySet<Restaurant>("Restaurants"); modelBuilder.EntityType<Restaurant>().HasKey(r => r.Id); // Adds OData and specify query capabilities builder.Services.AddControllers().AddOData( options => options.Select() .AddRouteComponents("odata", modelBuilder.GetEdmModel()) ); var app = builder.Build(); app.UseRouting(); app.MapControllers(); app.Run();
注意
将 <"Your connection URI">
占位符替换为您的MongoDB连接字符串。
此代码执行以下操作:
实例化新的
MongoClient
并将其注册为依赖项注入容器中的单例。定义实体数据模型 (EDM) 并使用键
Id
将Restaurants
注册为实体设立。添加 OData 服务并启用
Select()
查询操作。使用
AddRouteComponents()
方法注册路由。调用
UseRouting()
和MapControllers()
方法来匹配传入的HTTP请求并将它们路由到适当的端点。
注意
.NET/ C#驱动程序不支持使用 $apply
查询操作的 OData 聚合。
运行应用程序
使用 IDE 运行应用程序,或在项目根目录下的Shell中运行以下命令:
dotnet run ODataExample.csproj
运行应用程序后,您的终端会显示类似于以下内容的输出:
info: Microsoft.Hosting.Lifetime[14] Now listening on: http://localhost:5183 info: Microsoft.Hosting.Lifetime[0] Application started. Press Ctrl+C to shut down. info: Microsoft.Hosting.Lifetime[0] Hosting environment: Development info: Microsoft.Hosting.Lifetime[0] Content root path: <Path to your project>
提示
运行应用程序后,IDE 可能会自动打开浏览器窗口,指向运行应用程序的URL ,并显示 "page can't be found"
错误。这是意料之中的,因为应用程序仅配置了一个 Get
端点。
查询数据
要查询数据,请导航到应用程序中指定的 Get
端点。为此,请打开浏览器并导航到上一步终端输出中指定的 localhost
URL 。然后,追加 Get
端点的路由: /odata/Restaurants
。示例,如果应用程序在 localhost:5183
上运行,请导航到 http://localhost:5183/odata/Restaurants
。
如果成功,浏览器会以JSON格式显示集合中的 5 个餐厅。输出类似于以下内容:
{ "@odata.context": "http://localhost:5183/odata/$metadata#Restaurants", "value": [ { "Name": "Glorious Food", "RestaurantId": "40361521", "Cuisine": "American", "Borough": "Manhattan", "Id": "...", "Address": { "Building": "522", "Coordinates": [-73.95171, 40.767461], "Street": "East 74 Street", "ZipCode": "10021" }, "Grades": [ ... ] }, ... ] }
更多信息
To 学习;了解 more about ASP .NET Core OData, see the Microsoft OData documentation.
要学习;了解有关 OData 的更多信息,请参阅 OData 文档。