Usar OData com MongoDB
Nesta página
Visão geral
OData (Open Data Protocol) é um protocolo padronizado para construir e consumir APIs RESTful que permite a consulta e manipulação de dados usando solicitações HTTP. Ele fornece uma maneira uniforme de expor e interagir com dados de várias fontes.
Neste tutorial, você aprenderá como integrar o OData com seu aplicação MongoDB .
Dados de amostra
Este tutorial utiliza a sample_restaurants.restaurants
collection a partir do conjunto de dados de amostra do Atlas . Para aprender como criar um agrupamento de MongoDB Atlas gratuito e carregar os conjuntos de dados de amostra, consulte o Início Rápido do.
Tutorial
Instalar dependências
Crie um novo aplicação ASP.Net denominado ODataExample
e instale o driver .NET/C#. Você pode instalar o driver usando o gerenciador de pacote NuGet em seu IDE ou executando o seguinte comando no .NET CLI:
dotnet add package MongoDB.Driver
Em seguida, instale o pacote NuGet MongoDB.AspNetCore.OData
por meio do Gerenciador de pacotes NuGet ou por meio do .NET CLI executando o seguinte comando:
dotnet add package MongoDB.AspNetCore.OData
Definir seus modelos
Crie uma nova pasta na sua solução chamada Models
e copie os seguintes arquivos Restaurant.cs
, Address.cs
e GradeEntry.cs
para a pasta:
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; } }
Observação
Os documentos na collection restaurants
usam a convenção de nomenclatura snake-case. Os exemplos neste guia usam um ConventionPack
para desserializar os campos na coleção em maiúsculas e minúsculas Pascal e mapeá-los para as propriedades na classe Restaurant
.
Para saber mais sobre serialização personalizada, consulte Serialização personalizada.
Criar um controlador OData
Crie uma nova pasta na sua solução denominada Controllers
e adicione um novo arquivo de controlador denominado RestaurantsController.cs
. Copie o seguinte código no arquivo:
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); } }
Este código executa as seguintes ações:
Cria um construtor que se conecta ao MongoDB e obtém a coleção
restaurants
.Cria um endpoint
Get
que retorna todos os restaurantes da coleção.Especifica o atributo
MongoEnableQuery
para habilitar a query no endpointGet
.Especifica o atributo
PageSize
emMongoEnableQuery
para limitar o número de documentos retornados a5
.
Configurar o serviço OData
Cole o código a seguir no seu arquivo Program.cs
para configurar o serviço OData e mapear os endpoints do seu controlador.
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();
Observação
Substitua o espaço reservado <"Your connection URI">
pela string de conexão do MongoDB .
Este código executa as seguintes ações:
Instancia um novo
MongoClient
e o registra como um singleton no contêiner de injeção de dependência.Define o Modelo de Dados de Entidade (EDM) e registra
Restaurants
como um conjunto de entidades com a chaveId
.Adiciona o serviço OData e habilita a operação de query do
Select()
.Registra a rota utilizando o método
AddRouteComponents()
.Chama os métodos
UseRouting()
eMapControllers()
para corresponder às solicitações HTTP de entrada e encaminhá-las para o endpoint apropriado.
Observação
O driver .NET/C# não suporta OData-aggregation com a operação de query $apply
.
Executar o aplicativo
Execute o aplicação usando seu IDE ou executando o seguinte comando em seu shell no diretório raiz do seu projeto:
dotnet run ODataExample.csproj
Depois de executar o aplicação, seu terminal exibe uma saída semelhante a esta:
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>
Dica
Depois de executar o aplicação, o IDE pode abrir automaticamente uma janela do navegador no URL em que o aplicação está sendo executado, que exibe um erro "page can't be found"
. Isso é esperado porque o aplicação tem apenas um único endpoint Get
configurado.
Consultar os dados
Para executar query dos dados, navegue até o endpoint Get
especificado no aplicação. Para fazer isso, abra um navegador e navegue até a URL localhost
especificada na saída do terminal da etapa anterior. Em seguida, anexe a rota para o endpoint Get
: /odata/Restaurants
. Por exemplo, se um aplicação estiver em execução em localhost:5183
, navegue até http://localhost:5183/odata/Restaurants
.
Se for bem-sucedido, o navegador exibirá 5 restaurantes na coleção, no formato JSON. O resultado é semelhante ao seguinte:
{ "@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": [ ... ] }, ... ] }
Informações adicionais
Para saber mais sobre o ASP .NET Core OData, consulte a documentação do Microsoft OData.
Para saber mais sobre o OData, consulte a documentação do OData.