У меня есть коллекция, в которой данные выглядят так
{
"fname":"bob",
"lname":"jones",
"role":"professional",
"active":true,
"jobs":[{
"job":"janitor",
"current":true
},{
"job":"dog groomer"
"current":false
}]
}
Я использую «агрегат» для объединения и отбраковки некоторых данных, которые не нужны на стороне дисплея, и возврата упрощенного массива объектов.
People.aggregate([
{ "$match": { "role": "professional", "active": true }},
{ "$project": {
"name": { "$concat": ["$fname", " ", "$lname"] },
"jobs": {
"$filter": {
"input": "$jobs",
"as": "job",
"cond": { "$eq": ["$$job.current", true] }
}
}
}},
{ "$project": {
"name": 1,
"job": { "$arrayElemAt": ["$jobs.job", 0] }
}}
])
Однако я хочу передать и другие элементы в объекте People. Нужно ли их пропускать через весь трубопровод? Если я добавлю поля и в первый $ project - тогда вернется только одно из них ...
так что теперь ЭТО
People.aggregate([
{ "$match": { "role": "professional", "active": true }},
{ "$project": {
"name": { "$concat": ["$fname", " ", "$lname"] },
"jobs": {
"$filter": {
"input": "$jobs",
"as": "job",
"cond": { "$eq": ["$$job.current", true] }
}
},
"role":"$role",
"active":"$active"
}},
{ "$project": {
"name": 1,
"job": { "$arrayElemAt": ["$jobs.job", 0] },
"role":"$role",
"active":"$active"
}}
])
Дает мне:
name
job
role
Что мне не хватает?
Используйте $addFields
вместо $project
и используйте $project
с исключением, чтобы удалить поля lname и fname.
Так что-то вроде
People.aggregate([
{"$match":{"role":"professional","active":true}},
{"$addFields":{
"name":{"$concat":["$fname"," ","$lname"]},
"job":{
"$let":{
"vars":{
"jobs":{
"$arrayElemAt":[
{"$filter":{
"input":"$jobs",
"cond":{"$eq":["$$this.current",true]}
}},
0
]
}
},
"in":"$$jobs.job"
}
}
}},
{"$project":{"fname":0,"lname":0}}
])