MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Come utilizzare $ arrayElemAt e rimuovere i campi da quell'elemento in MongoDB $ proiezione?

Questo deriva dalla sintassi di arrayElemAt

Ciò significa che puoi costruire gli elementi dell'array come preferisci. Nel tuo caso vuoi solo il nome. Quindi dovrebbe funzionare:

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

Segui AGGIORNAMENTO :è stato chiesto come aggiungere proprietà aggiuntive oltre a name . Ecco il progetto:

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

Secondo follow-up come Drag0 ha chiesto nei commenti:Se quanto sopra non è abbastanza buono perché i risultati generano un utente:[] array di dimensione 1 invece di un utente oggetto:{} è possibile utilizzare quanto segue.

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