CosmosDB аггрегирование
От: Jericho113 Украина  
Дата: 28.08.21 18:01
Оценка:
Всем привет,

Столкнулся с задачей создания аггретата на основе данных хранящихся в CosmosDB (использую SQLAPI)
В БД (collection) есть однотипные JSON вида
{
    id:"123123", 
    type: "request",
    account:"john.doe@localhost.com",
    department:"dep1", 
    requestDate:"2021-01-02 01:02:03",
    status: "Pending",
    items:[
        {"code":"p-123-abc",qty:123,price:335.22},
        {"code":"p-321-abc",qty:3,price:123.22},
    ]
},
{
    id:"43234", 
    type: "request",
    account:"Jane.doe@XYZ.com",
    department:"dep222", 
    requestDate:"2021-02-02 01:02:03"
    status: "Rejected",    
    items:[
        {"code":"x-123-abc",qty:22,price:223},
        {"code":"z-321-abc",qty:334,price:2322},
    ]
}


каждый документ представляет собой заявку... таких могут быть десятки или сотни в день (до тысячи) так же к-во полей в документе порядка 40
ключем партиционирования выбран "account" "department" т.е ключ имеет вид "john.doe@localhost.com#dep1"

Нужно выводить на UI аггрегированные данные по юзерам и подразделениям с сортировкой по дате
т.е. что то такое
[

    {date:"2021-01-02, account:"john.doe@localhost.com", Status:"Completed"}
    {date:"2021-02-02, account:"jane.doe@localhost.com", Status:"Rejected"}
]


т.к. не хочется перечитывать все документы по всем партишин ключам каждый раз для выборки информации для UI то сделал в той же collection еще один документ с аггрегатами
куда добавляю новую строку при создании документа с типом "request" и апдейчу при изменении любого документа из "request"
{
    id:"9999999",
    type: "request_aggregator",
    account: "system@system", -- just to have unique partition key
    department: "analytic" -- just to have unique partition key
    items:[
        {date:"2021-01-02",  account:"john.doe@localhost.com",Status:"Completed", .... other fields }
        {date:"2021-02-02",  account:"jane.doe@localhost.com",Status:"Rejected", .. other fields}
    ]
}


т.к. писателей в коллекшен с документами несколько (около 5-7 независимых процессов на разных серверах) то кадждый из них перед тем как создать новый документ или изменить его статус
сначала вычитывает документ с типом "request_aggregator" и изменяет его а потом уже создает или изменяет докумен с типом "request"

Вопросы:
1) Как эти измененя сделать согласованными — т.е. что бы 2 писателя в аггрегирующий документ (type: "request_aggregator") не затерли изменения предыдущих ?
— 1й писатель выбирает документ с тремя значениями в items
— 2й писатель выбирает документ с тремя значениями в items
— 1й добавляет 4-е значение и сохраняет
— 2й добавляет 4-е значение и сохраняет перезаписывая то что добавил 1й писатель (вот не хочется терять тут изменения от писателя №1)

2) Может есть какой то способ сделать подобное в CosmosDB без костылей которые я делаю? Подозрение есть что слишком хрупкое все .
3) пересмотрел всю документацию но ничего не нашел по блокировкам документа на запись

Буду благодарен за советы по поводу того как лучше сделать аггрегирование в CosmosDB (сори выбор NoSQL не мой и поменять ее на другую не могу при всем желании)

PS: Если тема не для этого форума то плз перенесите ее в более релевантную ветку.
NetDigitally yours ....
CosmosDB
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.