Как найти дубликаты во вложенном массиве в cosmos db без GROUP BY и COUNT

Я пытаюсь найти дубликаты во вложенном объекте в коллекции. В старом SQL я бы сделал это с помощью каких-то GROUP BY и COUNT. Cosmos DB не поддерживает GROUP BY (насколько я понимаю), поэтому я пытаюсь найти решение. Одно ограничение заключается в том, что у меня есть доступ только к проводнику данных на лазурном портале (не спрашивайте).

Чтобы объяснить более подробно, предположим, что у вас есть следующая коллекция. Обратите внимание, что у первого элемента есть дубликат в коллекции "stuff":

[
    {
        "id": "1",
        "Name": "Item with duplicate stuff",
        "stuff" : [
            {
                "name" : "A",
            },
            {
                "name" : "B",
            },
            {
                "name" : "A"
            }  
        ]
    },
    {
        "id": "2",
        "Name": "Item with unique stuff",
        "stuff" : [
            {
                "name" : "A",
            },
            {
                "name" : "B",
            },
            {
                "name" : "C"
            }  
        ]
    }    

Я хочу найти все элементы в моей коллекции, у которых есть дубликаты в свойстве "stuff". В этом случае он вернет элемент с идентификатором «1». Что-то вроде этого было бы неплохо:

[
    {
        "id": "1"
    } 
] 

Ничего из того, что я пробовал, не сработало и не годится для показа здесь.


person AlexW-3891    schedule 29.05.2018    source источник


Ответы (2)


Cosmos db поддерживает подзапросы и ключевое слово DISTINCT. Итак, что-то вроде этого должно работать

  SELECT n2
    FROM c
    JOIN (SELECT DISTINCT value s.name FROM s IN c['stuff'])  n2

результат по первому пункту

[
    {
        "n2": "A"
    },
    {
        "n2": "B"
    },
    {
        "n2": "C"
    }
]

Ссылка: https://docs.microsoft.com/en-gb/azure/cosmos-db/sql-query-subquery

P.S. Кроме того, база данных Cosmos теперь поддерживает Группировку по https://docs.microsoft.com/en-gb/azure/cosmos-db/sql-query-group-by

person Apurv Gupta    schedule 17.10.2019

Да, как вы упомянули, CosmosDB в настоящее время не поддерживает GROUP BY или какое-либо другое агрегирование.

Однако вы можете создать группу, используя documentdb-lumenize. Вы загружаете cube.string как хранимую процедуру, а затем вызываете ее с конфигурацией агрегирования.

{cubeConfig: {groupBy: "name", field: "stuff.name", f: "max"}}

это должно делать то, что вы хотите.

или если вы хотите по-прежнему использовать sql api, вы можете попробовать использовать Join, как описано в ответе _ 5_

Лично я также столкнулся с той же проблемой, но мне пришлось справиться со своей собственной логикой после получения записей с отфильтрованными условиями.

ИЗМЕНИТЬ

В комментарии ниже должно быть указано «Да», поскольку вы упомянули, что CosmosDB в настоящее время не поддерживает ни GROUP BY , ни какое-либо другое агрегирование.

person Sajeetharan    schedule 29.05.2018
comment
То, что вы указали, неверно: хотя group by не поддерживается, API SQL Cosmos DB действительно поддерживает другие агрегаты (мин / макс / среднее / сумма / количество). (ссылка) - person David Makogon; 14.06.2018
comment
Нет проблем. Просто хотел, чтобы все было точно. - person David Makogon; 14.06.2018