如何使用日期时间字段查询Azure Cosmos DB中的对象

时间:2019-07-04 05:26:13

标签: c# .net linq azure azure-cosmosdb

我们需要使用datetime字段过滤Azure Cosmos DB的对象。对象的结构如下。

{
    "nodeId": 3,
    "nodeName": "HAVC",
    "assetId": 2,
    "assetName": "Chiller_02",
    "assetMeasurementId": 22,
    "assetMeasurementName": "CHL01_WATER_ENTER_TEMP",
    "streamId": 0,
    "streamName": null,
    "deviceId": 4,
    "deviceTagId": 48,
    "rawTelemetryData": 49,
    "observationPropertyId": 1,
    "isActive": false,
    "enqueueDatetime": "2019-05-31T07:17:45",
    "receivedDatetime": "2019-06-03T18:51:16.6684284",
    "id": "1e9fe261-5e73-4a64-8921-817a6c601ea0",
    "_rid": "PfsxALhViWYWAAAAAAAAAA==",
    "_self": "dbs/PfsxAA==/colls/PfsxALhViWY=/docs/PfsxALhViWYWAAAAAAAAAA==/",
    "_etag": "\"0000f80f-0000-1800-0000-5cf51e930000\"",
    "_attachments": "attachments/",
    "_ts": 1559568019
}

在这种情况下,我们需要使用“ receivedDatetime”字段查询数据,并且需要介于“ 18:51”到“ 18:57”之间的数据

在C#中,我们使用类似于LINQ的语法

var queryable = client.CreateDocumentQuery<TestDto>(
        UriFactory.CreateDocumentCollectionUri(DatabaseId, CollectionId),
        new { EnableCrossPartitionQuery = true })
    .Where(x => x.receivedDatetime >= DateTime.Parse(startDate))
    .Where(x => x.receivedDatetime <= DateTime.Parse(endDate))
    .OrderBy(x => x.receivedDatetime)
    .AsDocumentQuery();

但是我们无法收到预期的数据。感谢您能否提供一些支持

2 个答案:

答案 0 :(得分:1)

您可以检查此-DateTime, the Epoch and DocumentDb您必须以ISO-8601日期/时间格式存储ReceivedDatetime

答案 1 :(得分:1)

要对Cosmosdb中的数字字段进行有效的范围查询,必须在创建容器时在包含数字字段的路径上定义范围索引。

CosmosDB不支持查询 DateTime 。您可以在此处查看博客,以了解more