MongoDB: aggregate

Пример aggregation в Mongo:

db.targets.aggregate([
{$sort:{"processing":1}},
{$lookup:{
from:"campaigns",
let:{campaign:"$campaignname"},
pipeline:[
{$match:{$expr:{$and:[
{$eq:["$campaignname","$$campaign"]},
{$eq:["$enabled",true]}
]}}}
],
as:"campaign"}
},
{$unwind:"$campaign"},
{$limit:1},
{$set:{
date:Date.now(),
processing:{
$ifNull:[{$add:["$processing",1]},1]
}
}},
{$merge:"targets"}
]);

Соответствующий UPDATE в MySQL выглядел бы примерно так:

update targets 
inner join (
select targets.id from targets
inner join campaigns
on targets.campaignname=campaigns.campaignname
where campaigns.enabled
order by processing
limit 1
) t
on targets.id = t.id
set processing=IFNULL(processing,0)+1, date=now()

Второй вариант короче, проще, понятнее, и напишу я его в разы быстрее. В общем, по-моему, Mongo - это сильно на любителей заморочиться…

===
Перепечатка материалов блога разрешается с обязательной ссылкой на blog.coolsoftware.ru