Может ли Azure Cosmos DB выполнить такой запрос? - PullRequest
0 голосов
/ 21 октября 2019

У меня есть объект JSON, хранящийся в базе данных Azure Cosmos, и я вижу, есть ли способ написать работоспособные запросы, выполняющие такие базовые вещи, как Order By.

Структура выглядит примерно так:

[ 
   { 
      "id":"id1",
      "title":"test title",
      "dataRecord":{ 
         "version":1,
         "dataRecordItems":[ 
            { 
               "itemTitle":"item title 1",
               "type":"string",
               "value":"My First Title"
            },
            { 
               "itemTitle":"item number",
               "type":"number",
               "value":1
            },
            { 
               "itemTitle":"date",
               "type":"date",
               "value":"21/11/2019 00:00:00"
            }
         ]
      }
   },
   { 
      "id":"id2",
      "title":"test title again",
      "dataRecord":{ 
         "version":1,
         "dataRecordItems":[ 
            { 
               "itemTitle":"item title 2",
               "type":"string",
               "value":"My Second Title"
            },
            { 
               "itemTitle":"item number",
               "type":"number",
               "value":2
            },
            { 
               "itemTitle":"date",
               "type":"date",
               "value":"20/11/2019 00:00:00"
            }
         ]
      }
   ]

Я могу использовать ARRAY_CONTAINS для поиска объектов с определенным значением, но я сталкиваюсь со всеми видами проблем, если пытаюсь отсортировать по значению объекта с заголовком «date».

Итак, в качестве примера, я хотел бы иметь возможность сказать что-то вроде (псевдошумный код здесь):

SELECT  * FROM c WHERE
    ARRAY_CONTAINS(c.dataRecord.dataRecordItems, 
    {"itemTitle":"item title 2", "value" : "My Second Title"}, true)
    AND
    ARRAY_CONTAINS(c.dataRecord.dataRecordItems,{"itemTitle":"item number", "value" : 2}, true)
    ORDER BY < *** SOMEHOW GET THE DATE HERE from itemTitle = date ***

Тогда, в этом простом случае, я бы все вернул, но упорядочил по дате. .

Очевидно, что в будущем я буду вытаскивать отдельные поля, но если я не смогу выполнить первую часть, это будет спорным вопросом.

Просто интересно, есть ли у кого-нибудь великие идеи.

Ура!

1 Ответ

0 голосов
/ 21 октября 2019

Вам необходимо сохранить дату в формате ISO 8601:

Year:
      YYYY (eg 1997)
   Year and month:
      YYYY-MM (eg 1997-07)
   Complete date:
      YYYY-MM-DD (eg 1997-07-16)
   Complete date plus hours and minutes:
      YYYY-MM-DDThh:mmTZD (eg 1997-07-16T19:20+01:00)
   Complete date plus hours, minutes and seconds:
      YYYY-MM-DDThh:mm:ssTZD (eg 1997-07-16T19:20:30+01:00)
   Complete date plus hours, minutes, seconds and a decimal fraction of a
second
      YYYY-MM-DDThh:mm:ss.sTZD (eg 1997-07-16T19:20:30.45+01:00)
where:

     YYYY = four-digit year
     MM   = two-digit month (01=January, etc.)
     DD   = two-digit day of month (01 through 31)
     hh   = two digits of hour (00 through 23) (am/pm NOT allowed)
     mm   = two digits of minute (00 through 59)
     ss   = two digits of second (00 through 59)
     s    = one or more digits representing a decimal fraction of a second
     TZD  = time zone designator (Z or +hh:mm or -hh:mm)

https://www.w3.org/TR/NOTE-datetime

...