代码之家  ›  专栏  ›  技术社区  ›  j-p

MongoDB聚合,如何返回未受影响的项

  •  0
  • j-p  · 技术社区  · 7 年前

    {
        "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 回复  |  直到 7 年前
        1
  •  1
  •   s7vr    7 年前

    使用 $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}}
    ])
    
    推荐文章