Я использую mongoDB, в котором у меня есть коллекция следующего формата.
{name : x city : AAA , status : active , radius : 1 }
{name : x city : AAA , status : active , radius : 4 }
{name : x city : AAA , status : inactive , radius : 7 }
{name : x city : BBB , status : inactive , radius : 7 }
{name : Y city : AAA , status : active , radius : 8 }
{name : Y city : BBB , status : inactive , radius : 5 }
{name : Y city : BBB , status : inactive , radius : 12 }
{name : Z city : CCC , status : deleted , radius : 15 }
Теперь мне нужна уникальная комбинация имя и класс, и для этой комбинации также требуется подгруппа активного, неактивного и удаленного счетчика для поля статуса. таким образом, общий отчет о выпуске будет в формате ниже
Name City total Active Inactive deleted
X AAA 3 2 1 0
X BBB 1 0 1 0
Y AAA 1 1 0 0
Y BBB 2 0 2 0
Z CCC 1 0 0 1
Поскольку я новичок в mongodb, может ли кто-нибудь предложить, есть ли способ получить требуемый формат вывода с помощью агрегата или любого другого метода с минимальным запросом?
Вам потребуется просто один этап $group
, сгруппированный по имени и городу, и условная сумма для каждого из полей active
, inactive
и deleted
. Затем вы добавляете в конце этап $project
, чтобы получить именно тот формат, который вам нужен.
db.collection.aggregate([
{
$group: {
"_id": {
name: "$name",
city: "$city"
},
total: {
$sum: 1
},
active: {
$sum: {
$cond: [ { $eq: [ "$status", "active" ] }, 1, 0 ]
}
},
inactive: {
$sum: {
$cond: [ { $eq: [ "$status", "inactive" ] }, 1, 0 ]
}
},
deleted: {
$sum: {
$cond: [ { $eq: [ "$status", "deleted" ] }, 1, 0 ]
}
}
}
},
{
$project: {
_id: 0,
name: "$_id.name",
city: "$_id.city",
total: "$total",
active: "$active",
inactive: "$inactive",
deleted: "$deleted"
}
}
])
Превосходное использование $cond
в целях группировки.
Вы имеете в виду город вместо класс? Если да, пожалуйста, отредактируйте