Menu Docs
Página inicial do Docs
/ / /
C#/.NET
/

Usar OData com MongoDB

Nesta página

  • Visão geral
  • Dados de amostra
  • Tutorial
  • Instalar dependências
  • Definir seus modelos
  • Criar um controlador OData
  • Configurar o serviço OData
  • Executar o aplicativo
  • Consultar os dados
  • Informações adicionais

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 .

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.

1

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
2

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
{
[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; }
}

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.

3

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
[MongoEnableQuery(PageSize = 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 endpoint Get.

  • Especifica o atributo PageSize em MongoEnableQuery para limitar o número de documentos retornados a 5.

4

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 chave Id.

  • 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() e MapControllers() 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.

5

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.

6

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": [
...
]
},
...
]
}

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.

Voltar

Pesquisar geoespacialmente