【问题标题】:mongoose concat and single element from arraymongoose concat和数组中的单个元素
【发布时间】:2025-12-29 21:05:07
【问题描述】:

这是一个由两部分组成的 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 );
    }

我该怎么做?

【问题讨论】:

    标签: mongodb mongoose aggregation-framework


    【解决方案1】:

    你可以试试下面的聚合

    您可以使用$concatfnamelname 组合为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] }
          }
        }
      }}
    ])
    

    【讨论】:

    • 安东尼,感谢您抽出宝贵时间。我稍微修改了我的问题,因为我不知道聚合语法如何与查询过滤器语法相匹配。请参阅上面的问题修改
    • 我正在尝试您的建议
    • 好的,我已经根据你的问题更新了答案
    • hum - 我收到这个错误 - MongoError: The 'cursor' option is required, except for aggregate with the explain 参数 - 你也能解释一下 "$arrayElemAt": ["$$jobs.工作", 0] 正在做...
    • 这是您的第一个答案*.com/questions/50101104/…... 并且$arrayElemAt 从数组中获取索引元素(第二个参数用于索引)
    最近更新 更多