Агрегация MongoDB, как вернуть незатронутые элементы

У меня есть коллекция, в которой данные выглядят так

{
    "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

Что мне не хватает?

Использование JavaScript и MongoDB
Использование JavaScript и MongoDB
Сегодня я собираюсь вкратце рассказать о прототипах в JavaScript, а также представить и объяснить вам работу с базой данных MongoDB.
0
0
20
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Используйте $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}}
])

Другие вопросы по теме