Здравствуйте, хорошие разработчики.
Я новичок в MongoDB и пытаюсь получить условные данные для своих требований.
У меня есть следующая коллекция:
[
{
"id":10001,
"name":"Test 1",
"status":"live",
"traffics":[
{
"id":"1a3s5d435a4sd",
"status":"",
},
{
"id":"1a3s5d44as54d35a4sd",
"status":"CMP",
},
{
"id":"a3s5d454asd34asd",
"status":"",
},
{
"id":"1a35sd45a4sd34asd3",
"status":"TERM",
},
{
"id":"as35d435a4sd354as3d43asd4",
"status":"CMP",
},
{
"id":"135as4d5a4sd354a3s5d43asd",
"status":"CMP",
},
{
"id":"123as1d31a3d12ads13as",
"status":"TERM",
}
]
},
{...},{...}
]
Я хочу получить такие данные
ID, Name, count traffics as Starts, count (traffics where status = "CMP") as completes, count (traffics where status = "TERM") as Terminates, count (traffics where status = "") as Abandons
Я пытаюсь запустить следующую команду
db.inventory.aggregate( { $project: {id: 1, status: 1, starts: {$size: "$traffics"}, _id: 0}})
но я не знаю, как получить туда условные данные

Я думаю, вам может понадобиться запустить независимые операторы агрегации и использовать оператор $match.
$match: {
status: "CMP"
}
$match: {
status: "TERM"
}
$match: {
status: ""
}
Попробуйте этот код. Оператор $filter доступен с версии Mongodb 3.2.
db.inventory.aggregate( [
{ $project: {id: 1, status: 1, starts: {$size: "$traffics"},
completes:{$size: {$filter:{input:"$traffics",as:"item",cond:{$eq:[$$item.status,"CMP"]}}}},
terminates:{$size: {$filter:{input:"$traffics",as:"item",cond:{$eq:[$$item.status,"TERM"]}}}},
abandons:{$size: {$filter:{input:"$traffics",as:"item",cond:{$eq:[$$item.status,""]}}}},
_id: 0}
}
] )
Надеюсь, это поможет
Мне удалось немного изменить ответ @Yones, чтобы я мог получить количество записей в зависимости от условий.
так вот мой запрос для этого.
db.collection.aggregate({
$project: {
id: 1,
name: 1,
status: 1,
starts: {$size: "$traffics"},
completes: {
$size: {
$filter: {
input: "$traffics",
as: "item",
cond: {
$eq: [
"$$item.status",
"CMP"
]
}
}
}
},
terminates: {
$size: {
$filter: {
input: "$traffics",
as: "item",
cond: {
$eq: [
"$$item.status",
"TERM"
]
}
}
}
},
abandons: {
$size: {
$filter: {
input: "$traffics",
as: "item",
cond: {
$eq: [
"$$item.status",
""
]
}
}
}
},
_id: 0
}
})
Я просто фильтрую записи на основе своих условий, используя $фильтр
И затем я вычисляю его размер, используя $size.
Вот рабочий пример для этого ответа: https://mongoplayground.net/p/TcuLlJShclA
Привет, Йонес, спасибо. Это очень помогло, и я смог вывести свой запрос из этого. mongoplayground.net/p/TcuLlJShclA