MongoDB Aggregation, как вернуть незатронутые предметы - PullRequest
0 голосов
/ 09 сентября 2018

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

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

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

1 Ответ

0 голосов
/ 10 сентября 2018

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