Как сделать ALL () или ANY () в подмассиве документов - PullRequest
0 голосов
/ 25 мая 2020

Просто изучаю все тонкости CosmosDB. У меня есть следующие тестовые документы в CosmosDB:

[
    {
        "matchingID":123,
        "many":{
            "meta":"some data",
            "items":[
                {
                    "matchingID":921
                },
                {
                    "matchingID":123
                }
            ]
        }
    },
    {
        "matchingID":1337,
        "many":{
            "meta":"some more data",
            "items":[
                {
                    "matchingID":1337
                },
                {
                    "matchingID":1337
                }
            ]
        }
    },
    {
        "matchingID":9001,
        "many":{
            "meta":"all the datas",
            "items":[
                {
                    "matchingID":42
                },
                {
                    "matchingID":5318008
                }
            ]
        }
    }
]

Обратите внимание, что это тестовые документы - фактические документы имеют гораздо больше свойств как в элементе root, так и во вложенных элементах. У каждого элемента есть подмассив под c.many.items. Этот подмассив имеет свойство, которое может совпадать или не совпадать со свойством на нем root. Я надеюсь создать запрос, который позволит мне возвращать элементы, в которых ВСЕ их подэлементы совпадают, и другой запрос, который вернет то, что ЛЮБОЙ из них соответствует.

Например, SELECT * FROM c WHERE ALL(c.many.items.matchingID) = c.matchingID вернет второй элемент, поскольку все свойства подэлемента совпадают с их родительским элементом:

 {
        "matchingID":1337,
        "many":{
            "meta":"some more data",
            "items":[
                {
                    "matchingID":1337
                },
                {
                    "matchingID":1337
                }
            ]
        }
    }

SELECT * FROM c WHERE ANY(c.many.items.matchingID) = c.matchingID вернет первый объект, так как по крайней мере один из подэлементов соответствует свойству


    {
        "matchingID":123,
        "many":{
            "meta":"some data",
            "items":[
                {
                    "matchingID":921
                },
                {
                    "matchingID":123
                }
            ]
        }
    }

1 Ответ

2 голосов
/ 26 мая 2020

Я думаю, что SELECT * FROM c WHERE ANY(c.many.items.matchingID) = c.matchingID должен возвращать первый и второй объект.

  • ЛЮБОЙ

попробуйте это sql:

SELECT * FROM c where ARRAY_CONTAINS(c.many.items,{"matchingID":c.matchingID},true)

Вот результат:

 [
    {
        "matchingID": 123,
        "many": {
            "meta": "some data",
            "items": [
                {
                    "matchingID": 921
                },
                {
                    "matchingID": 123
                }
            ]
        }
    },
    {
        "matchingID": 1337,
        "many": {
            "meta": "some more data",
            "items": [
                {
                    "matchingID": 1337
                },
                {
                    "matchingID": 1337
                }
            ]
        }
    }
]
  • ВСЕ

Я не могу сделать это, просто используя sql. Поэтому я запрашиваю дважды.

Первый sql (получите массив matchingID):

select value d.matchingID from (select c.matchingID,max(t.matchingID) as max,min(t.matchingID) as min from c join t in c.many.items group by c.matchingID) d where d.max = d.min and d.max = d.matchingID

Кстати, если ваш matchingID не уникален, добавьте уникальное свойство после group by, например group by c.matchingID,c.id

Второй sql (получить объект):

SELECT * FROM c where ARRAY_CONTAINS('first sql result',c.matchingID,true)

Надеюсь, они вам помогут.


Обновить ответ:

Вот мой тестовый udf:

function compareMatchID(matchingID,subArray){
    var result = subArray.every(function(a){
        return a.matchingID == matchingID;
    });
    return result;
}

Вот sql:

SELECT * FROM c where udf.compareMatchID(c.matchingID,c.many.items)

Этот sql стоит 4,4RU с вашим примером документа.

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