Dela via


Arbeta med datum i Azure Cosmos DB för NoSQL

GÄLLER FÖR: NoSQL

Azure Cosmos DB for NoSQL ger schemaflexisk flexibilitet och omfattande indexering via en intern JSON-datamodell . Alla Azure Cosmos DB-resurser, inklusive databaser, containrar, dokument och lagrade procedurer, modelleras och lagras som JSON-dokument. Som ett krav för att vara portabel stöder JSON (och Azure Cosmos DB) endast en liten uppsättning grundläggande typer: String, Number, Boolean, Array, Object och Null. JSON är dock flexibelt och gör det möjligt för utvecklare och ramverk att representera mer komplexa typer med hjälp av dessa primitiver och skapa dem som objekt eller matriser.

Förutom de grundläggande typerna behöver DateTime många program typen för att representera datum och tidsinformation. Den här artikeln beskriver hur utvecklare kan lagra, hämta och fråga efter datum i Azure Cosmos DB med hjälp av .NET SDK.

Lagra DateTimes

Azure Cosmos DB stöder JSON-typer som - sträng, tal, boolesk, null, matris, objekt. Den har inte direkt stöd för en DateTime typ. Api:et för NoSQL stöder för närvarande inte lokalisering av datum. Därför måste du lagra datum- och tidsinformation som strängar. Det rekommenderade formatet för datum- och tidssträngar är yyyy-MM-ddTHH:mm:ss.fffffffZ, vilket följer ISO 8601 UTC-standarden. Vi rekommenderar att du lagrar alla datum i Azure Cosmos DB som UTC. Om du konverterar datumsträngarna till det här formatet kan du sortera datum lexicographically. Om icke-UTC-datum lagras måste logiken hanteras på klientsidan. Om du vill konvertera ett lokalt datum- och tidsvärde till UTC måste förskjutningen vara känd/lagrad som en egenskap i JSON och klienten kan använda förskjutningen för att beräkna UTC-datum- och tidsvärdet.

Intervallfrågor med datum- och tidssträngar som filter stöds endast om datum- och tidssträngarna alla finns i UTC. Systemfunktionen GetCurrentDateTime returnerar det aktuella ISO 8601-strängvärdet FÖR UTC-datum och tid i formatet: yyyy-MM-ddTHH:mm:ss.fffffffZ.

De flesta program kan använda standardsträngrepresentationen DateTime av följande skäl:

  • Strängar kan jämföras och den relativa ordningen för DateTime-värdena bevaras när de omvandlas till strängar.
  • Den här metoden kräver ingen anpassad kod eller attribut för JSON-konvertering.
  • Datumen som lagras i JSON är läsbara för människor.
  • Den här metoden kan dra nytta av indexet för snabba frågeprestanda.

Följande kodfragment lagrar till exempel ett Order objekt som innehåller två DateTime egenskaper – ShipDate och OrderDate som ett dokument med hjälp av .NET SDK:

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

Det här dokumentet lagras i följande struktur:

{
  "id": "aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb",
  "OrderDate": "2014-09-15T23:14:25.7251173Z",
  "ShipDate": "2014-09-30T23:14:25.7251173Z",
  "Total": 113.39
}

Du kan också lagra DateTimes som Unix-tidsstämplar, dvs. som ett tal som representerar antalet förflutna sekunder sedan den 1 januari 1970. Azure Cosmos DB för NoSQL:s interna tidsstämpelegenskap (_ts) följer den här metoden. Du kan använda UnixDateTimeConverter klassen för att serialisera datum och tider som tal.

Fråga efter datum och tid i LINQ

.NET SDK stöder automatiskt frågor mot data som lagras med hjälp av Language Integrated Query (LINQ). Följande kodfragment visar till exempel en LINQ-fråga som filtrerar beställningar som levererats under de senaste tre dagarna:

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

LINQ-frågan översätts till följande SQL-instruktion och körs på Azure Cosmos DB:

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

Mer information om frågespråket och LINQ-providern finns i LINQ till SQL-översättning.

Indexeringsdatum och tid för intervallfrågor

Frågor är vanliga med DateTime värden. Om du vill köra dessa frågor effektivt måste du ha ett index definierat på alla egenskaper i frågans filter.

Mer information om hur du konfigurerar indexeringsprinciper finns i indexeringsprinciper.