Docs Menu
Docs Home
/ / /
C#/.NET
/

MongoDB 와 함께 OData 사용

이 페이지의 내용

  • 개요
  • 샘플 데이터
  • 튜토리얼
  • 설치 종속성
  • 모델 정의
  • OData 컨트롤러 만들기
  • OData 서비스 구성
  • 애플리케이션 실행
  • 데이터 쿼리
  • 추가 정보

OData(Open Data Protocol)는 HTTP 요청을 사용하여 데이터를 쿼리하고 조작할 수 있는 RESTful API를 구축하고 사용하기 위한 표준화된 프로토콜 입니다. 여러 소스의 데이터를 노출하고 상호 작용 수 있는 균일한 방법을 제공합니다.

이 튜토리얼에서는 OData를 MongoDB 애플리케이션 과 통합하는 방법을 학습 봅니다.

sample_restaurants.restaurants 튜토리얼에서는 Atlas 샘플 데이터 세트의 컬렉션 을 사용합니다. 무료 MongoDB Atlas cluster 를 생성하고 샘플 데이터 세트를 로드하는 방법을 학습 보려면 빠른 시작을 참조하세요.

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.cs, Address.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 를 사용하여 컬렉션 의 필드를 파스칼식 대/소문자로 역직렬화하고 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 엔드포인트를 만듭니다.

  • Get 엔드포인트에서 쿼리를 활성화 하기 위한 MongoEnableQuery 속성을 지정합니다.

  • 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)을 정의하고 Restaurants 을(를) 키가 Id인 엔티티 설정하다 로 등록합니다.

  • OData 서비스를 추가하고 Select() 쿼리 작업을 활성화합니다.

  • AddRouteComponents() 메서드를 사용하여 경로를 등록합니다.

  • UseRouting()MapControllers() 메서드를 호출하여 수신 HTTP 요청을 일치시키고 적절한 엔드포인트로 라우팅합니다.

참고

.NET/ C# 드라이버 는 $apply 쿼리 작업에서 OData-Aggregation을 지원 하지 않습니다.

5

IDE를 사용하거나 프로젝트 의 루트 디렉토리 에 있는 셸 에서 다음 명령을 실행 하여 애플리케이션 을 실행합니다.

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 로 이동합니다.

성공적인 하면 브라우저에 컬렉션 5 개의 레스토랑이 JSON 형식으로 표시됩니다. 출력은 다음과 유사합니다.

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

ASP .NET Core OData에 학습 보려면 Microsoft OData 설명서를 참조하세요.

OData에 학습 보려면 OData 문서를 참조하세요.

돌아가기

지리공간적 검색