Запрос вложенных поддеревьев в БД Космос - PullRequest
0 голосов
/ 19 ноября 2018

Допустим, у меня есть отношение родитель-ребенок-внук-и так далее в документе Cosmos, представленном следующим JSON:

"id": "someUniqueString",
"peepsNkids": [
    "Jane": [
        "Joe": [],
        "Jocelyn": [
            "Jerry": [],
            "Jan": [
                "Tom": [],
                "Dick": [],
                "Harry": []
            ],
            "Jim": []
        ],
    "Mary": [
        "Moe": [],
        "Larry": [],
        "Dorothy": [
            "Eadie": [],
            "Phil": [],
            "Lucille": [
                "Desi Jr": []
            ]
        ]
    ]
]

Как я могу чисто запросить (в Storage Explorer и C #) поддерево, которое, используя синтаксис раздела «Поддокументы» этого поста под названием «Query DocumentDB» , разрешит:

SELECT * FROM peepsNkids.Jane.Jocelyn.Jan

... с ожиданием, что будет возвращено следующее?

[
    "Tom": [],
    "Dick": [],
    "Harry": []
]

Не думаю, что мне нужно беспокоиться об оригинальном идентификаторе. В худшем случае я получаю несколько записей, которые имеют Jane.Jocelyn.Jan, и, поскольку в моей "реальной" настройке все "имена" - это уникальные идентификаторы, возвращение нескольких строк указывает на серьезную проблему схемы.

Я, очевидно, могу создать потенциально циклическую объектную модель с string name и List<PersonAndKids> peepsNkids, затем получить обратно запись full для идентификатора "someUniqueString" и , а затем обойти объекты с большим количеством peepsNkids.TryGetValue("Jane", out firstParent) видов вещей, но я ищу способ сделать это в Космосе, а не в памяти моего сервиса.

1 Ответ

0 голосов
/ 20 ноября 2018

Вложенный запрос не работает

Похоже, ваша ошибка заключается в том, что вы должны запросить что-то вроде "вложенной таблицы", как вы упомянули в своем вопросе, с этим ...

SELECT * FROM c.peepsNkids.Jane.Jocelyn.Jan

Теперь вы правы, это точно , что показано как вложенный запрос в ссылке, которую вы предоставили , которая включает в себя этот запрос:

SELECT * 
FROM Families.address.state

Надеюсьне вижу способ выполнить это в Storage Explorer.Было бы интересно узнать, как использовать эту конструкцию или, если это возможно.

Составной эквивалент поля

Однако возможно выполнить эквивалентный запрос, который выбирает своего рода «составной»поле ", что приравнивается к таблице.Попробуйте это:

SELECT peepsNkids.Jane.Jocelyn.Jan FROM c

Или, что еще лучше, чтобы ограничить этот запрос конкретным документом по идентификатору, попробуйте следующее:

SELECT peepsNkids.Jane.Jocelyn.Jan FROM c WHERE c.id = 'someUniqueString'
...