Azure Cosmos DB for NoSQL에서 날짜 사용
적용 대상: NoSQL
Azure Cosmos DB for NoSQL은 네이티브 JSON 데이터 모델을 통해 스키마 유연성과 풍부한 인덱싱을 제공합니다. 데이터베이스, 컨테이너, 문서 및 저장 프로시저를 포함한 모든 Azure Cosmos DB 리소스는 모델링되어 JSON 문서로 저장됩니다. 이식 가능성을 위한 요구 사항인 JSON(및 Azure Cosmos DB)은 String, Number, Boolean, Array, Object 및 Null과 같은 기본 형식만 지원합니다. 그러나 JSON은 유연하므로 개발자와 프레임워크는 이러한 기본형을 사용하여 개체 또는 배열로 구성하여 보다 복잡한 형식을 나타낼 수 있습니다.
기본형 외에도 많은 애플리케이션에는 날짜 및 시간 정보를 나타내기 위해 DateTime
형식이 필요합니다. 이 문서에서는 개발자가 .NET SDK를 사용하여 Azure Cosmos DB에서 날짜를 저장, 검색 및 쿼리하는 방법에 대해 설명합니다.
날짜/시간 저장
Azure Cosmos DB는 문자열, 숫자, 부울, null, 배열, 개체와 같은 JSON 형식을 지원합니다. DateTime
형식을 직접 지원하지 않습니다. 현재 API for NoSQL은 날짜 지역화를 지원하지 않습니다. 따라서 날짜 및 시간 정보를 문자열로 저장해야 합니다. 날짜 및 시간 문자열에 권장되는 형식은 ISO 8601 UTC 표준을 따르는 yyyy-MM-ddTHH:mm:ss.fffffffZ
입니다. Azure Cosmos DB에는 모든 날짜를 UTC 기준으로 저장하는 것이 좋습니다. 날짜 문자열을 이 형식으로 변환하면 날짜를 사전순으로 정렬할 수 있습니다. UTC 기준이 아닌 날짜가 저장되면 클라이언트 측에서 논리를 처리해야 합니다. 현지 날짜 및 시간 값을 UTC로 변환하려면 오프셋이 JSON의 속성으로 알려지거나/저장되어야 하며 클라이언트는 오프셋을 사용하여 UTC 날짜 및 시간 값을 계산할 수 있습니다.
날짜 및 시간 문자열을 필터로 사용하는 범위 쿼리는 날짜 및 시간 문자열이 모두 UTC인 경우에만 지원됩니다. GetCurrentDateTime 시스템 함수는 현재 UTC 날짜 및 시간 ISO 8601 문자열 값을 yyyy-MM-ddTHH:mm:ss.fffffffZ
형식으로 반환합니다.
대부분의 애플리케이션에서는 다음과 같은 이유로 DateTime
의 기본 문자열 표현을 사용할 수 있습니다.
- 문자열을 비교할 수 있으며 DateTime 값이 문자열로 변환될 때 해당 값의 상대적 순서가 유지됩니다.
- 이 접근 방식에는 JSON 변환에 대해 사용자 지정 코드 또는 속성이 필요하지 않습니다.
- JSON에 저장된 날짜는 사람이 읽을 수 있습니다.
- 이 접근 방식은 빠른 쿼리 성능을 위해 인덱스를 활용할 수 있습니다.
예를 들어 다음 코드 조각은 .NET SDK를 사용하여 두 가지 DateTime
속성(ShipDate
및 OrderDate
)을 포함하는 Order
개체를 문서로 저장합니다.
public class Order
{
[JsonProperty(PropertyName="id")]
public string Id { get; set; }
public DateTime OrderDate { get; set; }
public DateTime ShipDate { get; set; }
public double Total { get; set; }
}
await container.CreateItemAsync(
new Order
{
Id = "aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb",
OrderDate = DateTime.UtcNow.AddDays(-30),
ShipDate = DateTime.UtcNow.AddDays(-14),
Total = 113.39
});
이 문서는 다음 구조로 저장됩니다.
{
"id": "aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb",
"OrderDate": "2014-09-15T23:14:25.7251173Z",
"ShipDate": "2014-09-30T23:14:25.7251173Z",
"Total": 113.39
}
또는 DateTime을 Unix 타임스탬프, 즉 1970년 1월 1일 이후로 경과된 초 수를 나타내는 숫자로 저장할 수 있습니다. Azure Cosmos DB for NoSQL의 내부 타임스탬프(_ts
) 속성은 이 접근 방식을 따릅니다. UnixDateTimeConverter
클래스를 사용하여 날짜와 시간을 숫자로 직렬화할 수 있습니다.
LINQ에서 날짜 및 시간 쿼리
.NET SDK는 LINQ(Language Integrated Query)를 사용하여 저장된 데이터 쿼리를 자동으로 지원합니다. 예를 들어 다음 코드 조각에서는 지난 3일 동안 배송된 주문을 필터링하는 LINQ 쿼리를 보여 줍니다.
IQueryable<Order> orders = container
.GetItemLinqQueryable<Order>(allowSynchronousQueryExecution: true)
.Where(o => o.ShipDate >= DateTime.UtcNow.AddDays(-3));
LINQ 쿼리는 다음 SQL 문으로 변환되고 Azure Cosmos DB에서 실행됩니다.
SELECT
*
FROM
root
WHERE
(root["ShipDate"] >= "2014-09-30T23:14:25.7251173Z")
쿼리 언어 및 LINQ 공급자에 대한 자세한 내용은 LINQ to SQL 변환을 참조하세요.
범위 쿼리의 인덱싱 날짜 및 시간
쿼리는 DateTime
값과 공통됩니다. 쿼리를 효율적으로 실행하려면 쿼리 필터의 속성에 인덱스가 정의되어야 합니다.
인덱싱 정책을 구성하는 방법에 대한 자세한 내용은 인덱싱 정책을 참조하세요.