Конкат mongoose и отдельный элемент из массива - PullRequest
0 голосов
/ 09 сентября 2018

Это вопрос из двух частей: mongoDB / mongoose

Я хочу объединить имя / фамилию в «имя» И я хочу показать только один «текущий» элемент из массива.

Так что, если мои данные выглядят так

[{
    "fname":"bob",
    "lname":"jones",
    "role":"professional", 
    "active":true,
    "jobs":[{
        "job":"janitor",
        "current":true
    },{
        "job":"dog groomer"
        "current":false
    }]
},{
    "fname":"sally",
    "lname":"peterson",
    "role":"professional", 
    "active":true,
    "jobs":[{
        "job":"engineer",
        "current":false
    },{
        "job":"college admin"
        "current":true
    }]
},{
    "fname":"jackson",
    "lname":"smiley",
    "role":"professional", 
    "active":true,
    "jobs":[{
        "job":"car salesman",
        "current":false
    },{
        "job":"street sweeper"
        "current":false
    }{
        "job":"house painter"
        "current":true
    }]
},{
    "fname":"katie",
    "lname":"smiley",
    "role":"amature", 
    "active":true,
    "jobs":[{
        "job":"drone entheuast",
        "current":true
    }]
}]

И я хочу, чтобы мои возвращаемые данные были

[{
    name:"bob jones", 
    job:"janitor"
},{
    name:"sally peterson", 
    job:"college admin"},
{
    name:"jackson smiley", 
    job:"house painter"
}]

В настоящее время - я использую этот синтаксис мангусты - но этого недостаточно ...

module.exports.getActiveList = function( callback ) {
        const query = { "role":"professional", "active":true }
        People.find( query, 'name job', callback );
    }

Как бы я это сделал?

1 Ответ

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

Вы можете попробовать ниже агрегации

Вы можете использовать $concat для объединения fname и lname как name и $filter для получения текущего активного задания из массива jobs

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] }}}
])

Или используя $let для завершения в одну стадию

People.aggregate([
  { "$match": { "role": "professional", "active": true }},
  { "$project": {
    "name": { "$concat": ["$fname", " ", "$lname"] },
    "job": {
      "$let": {
        "vars": {
          "jobs": {
            "$filter": {
              "input": "$jobs",
              "as": "job",
              "cond": { "$eq": ["$$job.current", true] }
            }
          }
        },
        "in": { "$arrayElemAt": ["$$jobs.job", 0] }
      }
    }
  }}
])
...