MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Comment utiliser $arrayElemAt et supprimer des champs de cet élément dans MongoDB $projection ?

Cela provient de la syntaxe de arrayElemAt

Ce qui signifie que vous pouvez construire vos éléments de tableau comme vous le souhaitez. Dans votre cas, vous ne voulez que le nom. Cela devrait donc fonctionner :

[{
  $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]
      }
    }
  }
}]

Suivre la MISE À JOUR :il a été demandé comment ajouter des propriétés supplémentaires au-dessus de name . Voici le projet :

{  
  $project: {  
    _id: 1,
    description: 1,
    title: 1,
    user: {  
      name: {  
        $arrayElemAt: ["$user.name", 0]
      },
      email: {  
        $arrayElemAt: ["$user.email", 0]
      }
    }
  }
}

Deuxième suivi comme Drag0 l'a demandé dans les commentaires :Si ce qui précède n'est pas suffisant car les résultats génèrent un utilisateur :[] tableau de taille 1 au lieu d'un objet utilisateur :{} ce qui suit peut être utilisé.

{  
  $project: {
    _id: 1,
    description: 1,
    title: 1,
    user: {
      $let: {
        vars: {
          firstUser: {
            $arrayElemAt: ["$user", 0]
          }
        },
        in: {
          name: "$$firstUser.name",
          email: "$$firstUser.email"
        }
      }
    }
  }
}