다음을 통해 공유


날짜 저장 및 쿼리 - Cosmos DB의 쿼리 언어(Azure 및 패브릭)

Cosmos DB(Azure 및 패브릭)는 네이티브 JSON 데이터 모델을 통해 스키마 유연성과 풍부한 인덱싱을 제공합니다. 데이터베이스, 컨테이너, 문서 및 저장 프로시저를 포함한 모든 Cosmos DB 리소스는 JSON 문서로 모델링되고 저장됩니다. 이식 가능에 대한 요구 사항으로 JSON(및 Cosmos DB)은 문자열, 숫자, 부울, 배열, 개체 및 Null과 같은 작은 기본 형식 집합만 지원합니다. 그러나 JSON은 유연하며 개발자와 프레임워크가 이러한 기본 형식을 사용하여 개체 또는 배열로 구성하는 더 복잡한 형식을 나타낼 수 있습니다.

기본 형식 외에도 많은 애플리케이션에서 날짜 및 시간 정보를 나타내는 형식이 필요합니다 DateTime . 이 문서에서는 개발자가 .NET SDK를 사용하여 Cosmos DB에서 날짜를 저장, 검색 및 쿼리하는 방법을 설명합니다.

Store DateTimes

Cosmos DB는 문자열, 숫자, 부울, null, 배열, 개체와 같은 JSON 형식을 지원합니다. 형식을 DateTime 직접 지원하지 않습니다. 현재 NoSQL용 API는 날짜의 지역화를 지원하지 않습니다. 따라서 날짜 및 시간 정보를 문자열로 저장해야 합니다. 날짜 및 시간 문자열에 권장되는 형식은 ISO 8601 UTC 표준을 따르는 형식입니다yyyy-MM-ddTHH:mm:ss.fffffffZ. 모든 날짜를 Cosmos DB에 UTC로 저장합니다. 날짜 문자열을 이 형식으로 변환하면 사전순으로 날짜를 정렬할 수 있습니다. UTC가 아닌 날짜가 저장되면 클라이언트 쪽에서 논리를 처리해야 합니다. 로컬 날짜 및 시간 값을 UTC로 변환하려면 오프셋을 JSON의 속성으로 알려거나 저장해야 하며 클라이언트는 오프셋을 사용하여 UTC 날짜 및 시간 값을 계산할 수 있습니다.

날짜 및 시간 문자열을 필터로 사용하는 범위 쿼리는 날짜 및 시간 문자열이 모두 UTC인 경우에만 지원됩니다. GetCurrentDateTime 시스템 함수는 현재 UTC 날짜 및 시간 ISO 8601 문자열 값을 다음과 같은 형식yyyy-MM-ddTHH:mm:ss.fffffffZ으로 반환합니다.

대부분의 애플리케이션은 다음과 같은 이유로 기본 문자열 표현 DateTime 을 사용할 수 있습니다.

  • 문자열을 비교할 수 있으며 DateTime 값의 상대적 순서는 문자열로 변환될 때 유지됩니다.
  • 이 방법은 JSON 변환을 위한 사용자 지정 코드 또는 특성이 필요하지 않습니다.
  • JSON에 저장된 날짜는 사람이 읽을 수 있습니다.
  • 이 방법은 빠른 쿼리 성능을 위해 인덱스 활용이 가능합니다.

예를 들어 다음 코드 조각은 .NET SDK를 사용하는 문서와 OrderDate 두 개의 DateTime 속성을 ShipDate 포함하는 개체를 저장 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
}
``  

Alternatively, you can store DateTimes as Unix timestamps, that is, as a number representing the number of elapsed seconds since **January 1, 1970**. Cosmos DB's internal timestamp (`_ts`) property follows this approach. You can use the [`UnixDateTimeConverter`](/dotnet/api/microsoft.azure.documents.unixdatetimeconverter) class to serialize dates and times as numbers.

## Query date and time in LINQ

The .NET SDK automatically supports querying data stored using Language Integrated Query (LINQ). For example, the following snippet shows a LINQ query that filters orders that were shipped in the last three days:

```csharp
IQueryable<Order> orders = container
    .GetItemLinqQueryable<Order>(allowSynchronousQueryExecution: true)
    .Where(o => o.ShipDate >= DateTime.UtcNow.AddDays(-3));

LINQ 쿼리는 다음 SQL 문으로 변환되고 Cosmos DB에서 실행됩니다.

SELECT
    *
FROM
    root
WHERE
    (root["ShipDate"] >= "2014-09-30T23:14:25.7251173Z")

쿼리 언어 및 LINQ 공급자에 대한 자세한 내용은 LINQ to SQL 번역을 참조하세요.

범위 쿼리의 인덱스 날짜 및 시간

쿼리는 값에서 DateTime 일반적입니다. 이러한 쿼리를 효율적으로 실행하려면 쿼리 필터의 속성에 대해 정의된 인덱스가 있어야 합니다.

인덱싱 정책을 구성하는 방법에 대한 자세한 내용은 인덱싱 정책을 참조하세요.