Docs 菜单
Docs 主页
/ / /
C#/.NET
/

将 OData 与MongoDB结合使用

在此页面上

  • Overview
  • 样本数据
  • Tutorial
  • 安装依赖项
  • 定义模型
  • 创建 OData 控制器
  • 配置 OData 服务
  • 运行应用程序
  • 查询数据
  • 更多信息

OData(开放数据协议)是一种标准化协议,用于构建和使用 RESTful API,允许使用HTTP请求查询和操作数据。它提供了一种统一的方式来公开多个来源的数据并交互。

在本教程中,您将学习;了解如何将 OData 与MongoDB应用程序集成。

本教程使用sample_restaurants.restaurants Atlas示例数据集中的 集合。要学习;了解如何创建免费的MongoDB Atlas 群集并加载示例数据集,请参阅 快速入门。

1

创建一个名为 ODataExample 的新 ASP.Net应用程序并安装.NET/ C#驱动程序。您可以在 IDE 中使用 NuGet包管理器,或在.NET CLI中运行以下命令来安装驾驶员:

dotnet add package MongoDB.Driver

然后,通过 NuGet 包经理或.NET CLI运行以下命令来安装 MongoDB.AspNetCore.OData NuGet包:

dotnet add package MongoDB.AspNetCore.OData
2

在解决方案中创建一个名为 Models 的新文件夹,并将以下 Restaurant.csAddress.csGradeEntry.cs 文件复制到该文件夹中:

public class Restaurant
{
[BsonRepresentation(BsonType.ObjectId)]
public string Id { get; set; }
public string Name { get; set; }
[BsonElement("restaurant_id")]
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; }
[BsonElement("coord")]
public double[] Coordinates { get; set; }
public string Street { get; set; }
[BsonElement("zipcode")]
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 类中的属性。

如需了解有关自定义序列化的更多信息,请参阅“自定义序列化”。

3

在解决方案中创建一个名为 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
[MongoEnableQuery(PageSize = 5)]
public ActionResult<IEnumerable<Restaurant>> Get()
{
return Ok(_restaurants);
}
}

此代码执行以下操作:

  • 创建连接到MongoDB的构造函数,并获取 restaurants集合。

  • 创建一个 Get 端点,用于返回集合中的所有餐厅。

  • 指定 MongoEnableQuery 属性以启用对 Get 端点的查询。

  • 指定 MongoEnableQueryPageSize 属性,以将返回的文档数量限制为 5

4

将以下代码粘贴到 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) 并使用键 IdRestaurants 注册为实体设立。

  • 添加 OData 服务并启用 Select()查询操作。

  • 使用 AddRouteComponents() 方法注册路由。

  • 调用 UseRouting()MapControllers() 方法来匹配传入的HTTP请求并将它们路由到适当的端点。

注意

.NET/ C#驱动程序不支持使用 $apply查询操作的 OData 聚合。

5

使用 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 端点。

6

要查询数据,请导航到应用程序中指定的 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 文档。

后退

副本集操作