Запрос CosmosDb Sql, который соответствует общим значениям в массиве между документами - PullRequest
2 голосов
/ 13 января 2020

Я работаю с Cosmos DB и хочу написать запрос SQL, который будет соответствовать общему значению в массиве документов на основе идентификатора.

Чтобы представить, представьте, что у вас есть следующие три документа:

{
        "id": "2ECF4568-CB0E-4E11-A5CD-1206638F9C39",
        "entityType": "ServiceInformationFacility",
        "facilities": [
            {
                "id": "6F706BA3-27AD-45B8-9831-A531E37C4C17",
                "facilityName": "Kat Service Center",
                "phoneNumber": "9879561234"

            },
            {
                "id": "7F706BA3-27AD-45B8-9831-A531E37C4C17",
                "facilityName": "Honda Service Center",
                "phoneNumber": "9879561234"

            }]

    },
    {
        "id": "3ECF4568-CB0E-4E11-A5CD-1206638F9C39",
        "entityType": "ServiceInformationFacility",
        "facilities": [
            {
                "id": "8F706BA3-27AD-45B8-9831-A531E37C4C17",
                "facilityName": "Hyundai Service Center",
                "phoneNumber": "9879561234"

            },
            {
                "id": "7F706BA3-27AD-45B8-9831-A531E37C4C17",
                "facilityName": "Honda Service Center",
                "phoneNumber": "9879561234"

            }]

    },
    {
        "id": "6ECF4568-CB0E-4E11-A5CD-1206638F9C39",
        "entityType": "ServiceInformationFacility",
        "facilities": [
            {
                "id": "8F706BA3-27AD-45B8-9831-A531E37C4C17",
                "facilityName": "Hyundai Service Center",
                "phoneNumber": "9879561234"

            },
            {
                "id": "7F706BA3-27AD-45B8-9831-A531E37C4C17",
                "facilityName": "Honda Service Center",
                "phoneNumber": "9879561234"
            } ]
    }

Я хочу написать запрос, который возвращает все общие средства на основе идентификатора. Это означает, что при передаче списка идентификаторов средство, существующее в данных идентификаторах, должно отображаться (не либо, либо). поэтому в приведенной выше коллекции он должен только возвращать «имя_хозяйства»: « Сервисный центр Honda », передавая параметр id (« 2ECF4568-CB0E-4E11-A5CD-1206638F9C39 », " 3ECF4568-CB0E-4E11-A5CD-1206638F9C39"," 6ECF4568-CB0E-4E11-A5CD-1206638F9C39").

Пока я пробовал:

SELECT q.facilityName  FROM c
join q in c.facilities
where c.id in('6ECF4568-CB0E-4E11-A5CD-1206638F9C39','2ECF4568-CB0E-4E11-A5CD-1206638F9C39')AND c.entityType = 'ServiceInformationFacility'

Это дает мне все название объекта, но мне нужно только средство, которое является общим в вышеуказанных документах, это "имя_хозяйства": "Сервисный центр Honda".

Заранее спасибо

1 Ответ

0 голосов
/ 14 января 2020

Это дает мне все название учреждения, но мне нужен только объект, который является общим в приведенных выше документах, это "имя_хозяйства": "Сервисный центр Honda".

Я могу получить ваше точка сейчас. Однако, я боюсь, что это невозможно в космосе sql. Я пытаюсь посчитать количество появлений facilitiesName пересечения документов и получить решение, наиболее близкое к вашим потребностям.

sql:

SELECT count(c.id) as cnt, f.facilityName from c 
join f in c.facilities
where array_contains(['6ECF4568-CB0E-4E11-A5CD-1206638F9C39','2ECF4568-CB0E-4E11-A5CD-1206638F9C39'],c.id,true)
AND c.entityType = 'ServiceInformationFacility'
group by f.facilityName

вывод:

enter image description here

Затем я попытался расширить его с помощью некоторого подзапроса , но безуспешно. Поэтому я бы предложил использовать хранимую процедуру, чтобы завершить sh следующее задание. Основная цель - зациклить вышеуказанный результат и оценить, равен ли cnt [ids array].length.


Обновление ответа для сохраненного код процедуры:

входной параметр для @idArray: ["6ECF4568-CB0E-4E11-A5CD-1206638F9C39","2ECF4568-CB0E-4E11-A5CD-1206638F9C39"]

enter image description here

Sp код:

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

    var length = idArray.length;

    var sqlQuery = {
        "query":  'SELECT count(c.id) as cnt, f.facilityName from c join f in c.facilities '+
        'where array_contains( @idArray,c.id,true) ' +
        'AND c.entityType = "ServiceInformationFacility" group by f.facilityName',
        "parameters": [
            {"name": "@idArray", "value": idArray}
        ]
    }

    // Query documents and take 1st item.
    var isAccepted = collection.queryDocuments(
        collection.getSelfLink(),
        sqlQuery,
    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 returenArray = [];
            for(var i=0;i<feed.length;i++){                
                if(feed[i].cnt==length)
                    returenArray.push(feed[i])
            }

            response.setBody(returenArray);
        }
    });

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

Вывод:

enter image description here

...