Рекурсивно получить документы в хранимой процедуре Azure Cosmos - PullRequest
0 голосов
/ 28 ноября 2018

Я пытаюсь сгенерировать дерево контента для простой вики.Каждая страница имеет свойство Children, в котором хранится идентификатор других вики-страниц.Я пытаюсь написать SPROC, который получает все документы, затем перебирает свойство Children каждой страницы и заменяет каждый элемент реальным документом вики-страницы.Я могу получить первый набор документов, но wikiChildQuery возвращает undefined, и я не совсем уверен, почему.

Я смог получить документ только с одним запросом, но для некоторыхпричина, это не работает в SPROC.Я что-то упускаю здесь?

function GetWikiMetadata(prefix) {
    var context = getContext();
    var collection = context.getCollection();
    var metadataQuery = 'SELECT {\"ExternalId\": p.ExternalId, \"Title\": p.Title, \"Slug\": p.Slug, \"Children\": p.Children} FROM Pages p'

    var metadata = collection.queryDocuments(collection.getSelfLink(), metadataQuery, {}, function (err, documents, options) {
        if (err) throw new Error('Error: ', + err.message);

        if (!documents || !documents.length) {
            throw new Error('Unable to find any documents');
        } else {
            var response = getContext().getResponse();

            for (var i = 0; i < documents.length; i++) {
                var children = documents[i]['$1'].Children;

                if (children.length) {
                    for (var j = 0; j < children.length; j++) {
                        var child = children[j];

                        children[j] = GetWikiChildren(child);
                    }
                }
            }

            response.setBody(documents);
        }
    });

    if (!metadata) throw new Error('Unable to get metadata from the server');

    function GetWikiChildren(child) {
        var wikiChildQuery = metadataQuery + ' WHERE p.ExternalId = \"' + child + '\"';

        var wikiChild = collection.queryDocuments(collection.getSelfLink(), wikiChildQuery, {}, function(err, document, options) {
            if (err) throw new Error('Error: ', + err.message);

            if (!document) {
                throw new Error('Unable to find child Wiki');
            } else {
                var children = document.Children;

                if (children) {
                    for (var k = 0; k < children.length; k++) {
                        var child = children[k];

                        children[k] = GetWikiChildren(child);
                    }
                } else {
                    return document;
                }
            }

            if (!wikChild) throw new Error('Unable to get child Wiki details');
        });
    }
}

1 Ответ

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

1. Я могу получить первый набор документов, но wikiChildQuery возвращает неопределенное значение, и я не совсем уверен, почему.

Во-первых, здесь следует исправить.В первом цикле вы получаете массив детей с documents[i]['$1'].Children, однако, в функции GetWikiChildren вы хотите получить массив детей с document.Children?Конечно, это undefined.Вам нужно использовать var children = document[0]['$1'].Children;

2. Похоже, что вы пропустили метод replaceDocument.

Вы можете сослаться на фрагмент кода своей функции metaDataQuery:

for (var i = 0; i < documents.length; i++) {
            var children = documents[i]['$1'].Children;

            if (children.length) {
                for (var j = 0; j < children.length; j++) {
                    var child = children[j];

                    children[j] = GetWikiChildren(child);
                }
            }
            documents[i]['$1'].Children = children;
            collection.replaceDocument(doc._self,doc,function(err) {
                             if (err) throw err;
                 });
        }

3.Парциальное обновление до сих пор не поддерживается Cosmos db SQL Api, но оно еще впереди.

Итак, если ваш sql не поддерживаетохватить все столбцы, это не может быть сделано для цели замены. ( feedback ) Важно отметить, что столбцы, которые не упомянуты в объекте замены, будут уничтожены при использовании метода replaceDocument.

...