Tarihleri depolama ve sorgulama - Cosmos DB'de sorgu dili (Azure ve Doku'da)

Cosmos DB (Azure ve Doku'da), yerel JSON veri modeli aracılığıyla şema esnekliği ve zengin dizin oluşturma sağlar. Veritabanları, kapsayıcılar, belgeler ve saklı yordamlar dahil olmak üzere tüm Cosmos DB kaynakları JSON belgeleri olarak modellenir ve depolanır. JSON (ve Cosmos DB), taşınabilir olmanın bir gereksinimi olarak yalnızca küçük bir temel tür kümesini destekler: Dize, Sayı, Boole, Dizi, Nesne ve Null. Ancak JSON esnektir ve geliştiricilerin ve çerçevelerin bu temelleri kullanarak daha karmaşık türleri temsil etmesine ve bunları nesne veya dizi olarak oluşturmasına olanak tanır.

Temel türlere ek olarak, birçok uygulamanın tarih ve saat bilgilerini temsil etmek için bu türe ihtiyacı vardır DateTime . Bu makalede geliştiricilerin .NET SDK'sını kullanarak Cosmos DB'de tarihleri depolama, alma ve sorgulama işlemleri açıklanmaktadır.

Mağaza TarihiSaatleri

Cosmos DB dize, sayı, boole, null, dizi, nesne gibi JSON türlerini destekler. Bir türü doğrudan desteklemez DateTime . Şu anda NoSQL API'si tarihlerin yerelleştirilmesini desteklememektedir. Bu nedenle, tarih ve saat bilgilerini dize olarak depolamanız gerekir. Tarih ve saat dizeleri için önerilen biçim, yyyy-MM-ddTHH:mm:ss.fffffffZ UTC standardına uygun olan biçimidir. Cosmos DB'de tüm tarihleri UTC olarak depolayın. Tarih dizelerinin bu biçime dönüştürülmesi, tarihlerin sözcük temelli olarak sıralanmasına olanak sağlar. UTC olmayan tarihler depolanıyorsa mantığın istemci tarafında işlenmesi gerekir. Yerel tarih ve saat değerini UTC'ye dönüştürmek için, uzaklık JSON'da bir özellik olarak bilinmeli/depolanmalıdır ve istemci UTC tarih ve saat değerini hesaplamak için uzaklığı kullanabilir.

Tarih ve saat dizelerini filtre olarak içeren aralık sorguları yalnızca tarih ve saat dizelerinin tümü UTC'deyse desteklenir. GetCurrentDateTime sistem işlevi geçerli UTC tarih ve saatini ISO 8601 dize değeri biçiminde döndürür: yyyy-MM-ddTHH:mm:ss.fffffffZ.

Çoğu uygulama aşağıdaki nedenlerle varsayılan dize gösterimini DateTime kullanabilir:

  • Dizeler karşılaştırılabilir ve DateTime değerlerinin göreli sırası dizelere dönüştürüldüklerinde korunur.
  • Bu yaklaşım JSON dönüştürmesi için herhangi bir özel kod veya öznitelik gerektirmez.
  • JSON'da depolanan tarihler okunabilir.
  • Bu yaklaşım, hızlı sorgu performansı için dizinden yararlanabilir.

Örneğin, aşağıdaki kod parçacığı iki Order özellik içeren bir DateTime nesneyi depolar: ShipDate ve OrderDate .NET SDK'sını kullanan bir belge olarak:

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
    });

Bu belge aşağıdaki yapıda depolanır:

{
  "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 sorgusu aşağıdaki SQL deyimine çevrilir ve Cosmos DB'de yürütülür:

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

Sorgu dili ve LINQ sağlayıcısı hakkında daha fazla bilgi için bkz. LINQ to SQL çevirisi.

Aralık sorguları için dizin tarihi ve saati

Sorgular değerlerle DateTime ortaktır. Bu sorguları verimli bir şekilde yürütmek için, sorgunun filtresindeki tüm özelliklerde tanımlanmış bir dizininiz olmalıdır.

Dizin oluşturma ilkelerini yapılandırma hakkında daha fazla bilgi için bkz. dizin oluşturma ilkeleri.