MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Como usar $arrayElemAt e remover campos desse elemento no MongoDB $projection?


Isso é da sintaxe de arrayElemAt

O que significa que você pode construir seus elementos de matriz como quiser. No seu caso, você quer apenas o nome. Então isso deve funcionar:
[{
  $match: {
    jobCategoryId: mongoose.Types.ObjectId(jobCategoryId)
  }
}, {  
  $lookup: {  
    from: 'users',
    localField: 'userId',
    foreignField: '_id',
    as: 'user'
  }
}, {  
  $project: {  
    _id: 1,
    description: 1,
    title: 1,
    user: {  
      name: {
        $arrayElemAt: ["$user.name", 0]
      }
    }
  }
}]

Acompanhar ATUALIZAÇÃO :foi perguntado como adicionar propriedades em cima de name . Aqui está o projeto:
{  
  $project: {  
    _id: 1,
    description: 1,
    title: 1,
    user: {  
      name: {  
        $arrayElemAt: ["$user.name", 0]
      },
      email: {  
        $arrayElemAt: ["$user.email", 0]
      }
    }
  }
}

Segundo acompanhamento como Drag0 perguntou nos comentários:Se o acima não for bom o suficiente porque os resultados geram uma matriz user:[] de tamanho 1 em vez de um objeto user:{} o seguinte pode ser usado.
{  
  $project: {
    _id: 1,
    description: 1,
    title: 1,
    user: {
      $let: {
        vars: {
          firstUser: {
            $arrayElemAt: ["$user", 0]
          }
        },
        in: {
          name: "$$firstUser.name",
          email: "$$firstUser.email"
        }
      }
    }
  }
}