GOOGLE ADS

пятница, 6 мая 2022 г.

Агрегация с обновлением в mongoDB

У меня есть коллекция со многими похожими структурированными документами, два документа выглядят так

Вход:

{
"_id": ObjectId("525c22348771ebd7b179add8"),
"cust_id": "A1234",
"score": 500,
"status": "A"
"clear": "No"
}
{
"_id": ObjectId("525c22348771ebd7b179add9"),
"cust_id": "A1234",
"score": 1600,
"status": "B"
"clear": "No"
}

По умолчанию clearдля всех документов используется "No",

Требование: я должен добавить оценку всех документов с одинаковым cust_id, если они принадлежат status "A"и status "B". Если scoreпревышает 2000, я должен обновить clearатрибут "Yes"для всего документа с одним и тем же cust_id.

Ожидаемый результат:

{
"_id": ObjectId("525c22348771ebd7b179add8"),
"cust_id": "A1234",
"score": 500,
"status": "A"
"clear": "Yes"
}
{
"_id": ObjectId("525c22348771ebd7b179add9"),
"cust_id": "A1234",
"score": 1600,
"status": "B"
"clear": "Yes"
}

Да потому что 1600+500 = 2100, а 2100 > 2000.

Мой подход: я смог получить сумму только по агрегатной функции, но не смог обновить

db.aggregation.aggregate([
{$match: {
$or: [
{status: 'A'},
{status: 'B'}
]
}},
{$group: {
_id: '$cust_id',
total: {$sum: '$score'}
}},
{$match: {
total: {$gt: 2000}
}}
])

Пожалуйста, предложите мне, как мне поступить.


Решение проблемы

После многих проблем, экспериментируя с оболочкой монго, я наконец получил решение своего вопроса.

Псевдокод:

# To get the list of customer whose score is greater than 2000
cust_to_clear=db.col.aggregate(
{$match:{$or:[{status:'A'},{status:'B'}]}},
{$group:{_id:'$cust_id',total:{$sum:'$score'}}},
{$match:{total:{$gt:500}}})
# To loop through the result fetched from above code and update the clear
cust_to_clear.result.forEach
(
function(x)
{
db.col.update({cust_id:x._id},{$set:{clear:'Yes'}},{multi:true});
}
)

Пожалуйста, прокомментируйте, если у вас есть другое решение для того же вопроса.

Комментариев нет:

Отправить комментарий

Laravel Datatable addColumn returns ID of one record only

Я пытаюсь использовать Yajra Datatable для интеграции DataTable на свой веб-сайт. Я смог отобразить таблицу, но столкнулся с проблемой. В по...