Megosztás a következőn keresztül:


Dátumok tárolása és lekérdezése – Lekérdezési nyelv a Cosmos DB-ben (az Azure-ban és a Fabricben)

A Cosmos DB (az Azure-ban és a Fabricben) egy natív JSON-adatmodellen keresztül nyújt sémarugalmasságot és gazdag indexelést. Minden Cosmos DB-erőforrás, beleértve az adatbázisokat, tárolókat, dokumentumokat és tárolt eljárásokat, JSON-dokumentumokként modellezhető és tárolható. A hordozhatóság követelménye, hogy a JSON (és a Cosmos DB) csak néhány alaptípust támogat: Sztring, Szám, Logikai, Tömb, Objektum és Null. A JSON azonban rugalmas, és lehetővé teszi, hogy a fejlesztők és a keretrendszerek összetettebb típusokat képviseljenek ezekkel a primitívekkel, és objektumként vagy tömbként írja őket.

Az alaptípusok mellett számos alkalmazásnak szüksége van a DateTime dátum- és időadatok megjelenítéséhez szükséges típusra. Ez a cikk azt ismerteti, hogy a fejlesztők hogyan tárolhatják, kérdezhetik le és kérdezhetik le a dátumokat a Cosmos DB-ben a .NET SDK használatával.

Store DateTimes

A Cosmos DB támogatja az olyan JSON-típusokat, mint a - sztring, szám, logikai, null, tömb, objektum. Nem támogatja közvetlenül a típust DateTime . A NoSQL API jelenleg nem támogatja a dátumok honosítását. Ezért sztringekként kell tárolnia a dátum- és időadatokat. A dátum- és idősztringek ajánlott formátuma az yyyy-MM-ddTHH:mm:ss.fffffffZISO 8601 UTC szabványt követi. Az összes dátumot a Cosmos DB-ben tárolja UTC formátumban. A dátumsztringek formátumba való konvertálása lehetővé teszi a dátumok lexikális rendezését. Ha nem UTC dátumokat tárol, a logikát az ügyféloldalon kell kezelni. Ha egy helyi dátum- és időértéket UTC-vé szeretne alakítani, az eltolást a JSON tulajdonságaként kell megadni/tárolni, és az ügyfél használhatja az eltolást az UTC dátum- és időérték kiszámításához.

A dátum- és idősztringeket szűrőként tartalmazó tartomány-lekérdezések csak akkor támogatottak, ha a dátum- és idősztringek mind UTC-ben vannak. A GetCurrentDateTime rendszerfüggvény a jelenlegi UTC dátumot és időpontot adja vissza az ISO 8601 sztring értékének formátumában: yyyy-MM-ddTHH:mm:ss.fffffffZ.

A legtöbb alkalmazás az alábbi okokból használhatja az alapértelmezett sztring-ábrázolásokat DateTime :

  • A sztringek összehasonlíthatók, és a DateTime-értékek relatív sorrendje megmarad, amikor sztringekké alakulnak át.
  • Ez a megközelítés nem igényel egyéni kódot vagy attribútumokat a JSON-átalakításhoz.
  • A JSON-ban tárolt dátumok emberi olvashatók.
  • Ez a megközelítés kihasználhatja az index előnyeit a gyors lekérdezési teljesítmény érdekében.

A következő kódrészlet például egy Order két DateTime tulajdonságot tartalmazó objektumot tárol , ShipDate és OrderDate a .NET SDK-t használó dokumentumként:

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

Ez a dokumentum a következő struktúrában van tárolva:

{
  "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));

A LINQ-lekérdezés a következő SQL-utasításra lesz lefordítva, és a Cosmos DB-n hajtja végre:

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

A lekérdezés nyelvével és a LINQ-szolgáltatóval kapcsolatos további információkért tekintse meg a LINQ–SQL-fordítást.

Tartomány-lekérdezések indexelési dátuma és ideje

A lekérdezések gyakran szerepelnek az értékekben DateTime . A lekérdezések hatékony végrehajtásához indexet kell definiálnia a lekérdezés szűrőjének bármely tulajdonságán.

További információ az indexelési szabályzatok konfigurálásáról: indexelési szabályzatok.