{ "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对象中的其他项。 它们需要穿过整个管道吗? 如果我也将字段添加到第一个$项目中-那么只有一个字段返回。。。
所以现在这个
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 使用 $项目
$addFields
$project
$项目
比如说
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}} ])