Azure Cosmos DB добавляет связанные объекты в результат запроса - PullRequest
1 голос
/ 10 февраля 2020

В моей коллекции космических БД у меня есть объекты такого типа:

// Suppliers:

[{
    "id": "some_unique_str",
    "products": [
        "id_of_product1",
        "id_of_product2"
    ]
}]

// Products: 

[{
    "id": "id_of_product1",
    "name": "product name"
},
//...
]

Мне нужно написать запрос, чтобы получить такой результат:

[{
    "id": "some_unique_str",
    "products": [
        {
            "id": "id_of_product1",
            "name": "product 1 name"
        },
        {
            "id": "id_of_product2",
            "name": "product 2 name"
        }
    ]
}]

Другими словами: I ' Я пытаюсь добиться расширения функциональности OData. Возможно ли это?

1 Ответ

1 голос
/ 11 февраля 2020

Вы не можете достичь этого с помощью прямого sql в космосе db sql api. Ваши потребности могут быть реализованы с помощью внешнего ключа в реляционной базе данных, а не без sql базы данных.

В Cosmos DB sql API, вы можете достичь этого с помощью хранимой процедуры. Я пытался написать некоторый код для вашего ссылка:

function sample(prefix) {
    var collection = getContext().getCollection();

    var isAccepted = collection.queryDocuments(
        collection.getSelfLink(),
        'SELECT c.id,c.products FROM c where is_defined(c.products)',
    function (err, feed, options) {
        if (err) throw err;

        if (!feed || !feed.length) {
            var response = getContext().getResponse();
            response.setBody('no docs found');
        }
        else {
            var response = getContext().getResponse();
            var returnArray = [];
            for (var i=0;i<feed.length;i++){  
                var map = {};
                map['id'] = feed[i].id;
                mergeData(map,feed[i].products);
                returnArray.push(map);
            }
            response.setBody(returnArray);
        }
    });

    if (!isAccepted) throw new Error('The query was not accepted by the server.');

    function mergeData(map,idArray){
        var sqlQuery = {
            "query":  'SELECT c.id,c.name FROM c where not is_defined(c.products) and '+
             ' array_contains( @idArray,c.id,true) ',
            "parameters": [
                {"name": "@idArray", "value": idArray}
            ]
        }
        var isAccepted = collection.queryDocuments(
        collection.getSelfLink(),
        sqlQuery,
        function (err, feed, options) {
        if (err) throw err;

        if (!feed || !feed.length) {
            map['products'] = [];
        }
        else {
           map['products'] = feed;
        }
    });
    }
}

Вывод с вашими образцами данных:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...