MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Wie verwende ich $arrayElemAt und entferne Felder aus diesem Element in MongoDB $projection?

Dies stammt aus der Syntax von arrayElemAt

Das bedeutet, dass Sie Ihre Array-Elemente beliebig konstruieren können. In Ihrem Fall möchten Sie nur den Namen. Das sollte also funktionieren:

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

Nachverfolgung von UPDATE :Es wurde gefragt, wie zusätzliche Eigenschaften über name hinzugefügt werden können . Hier ist das Projekt:

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

Zweites Follow-up wie Drag0 in den Kommentaren fragte:Wenn das obige nicht gut genug ist, weil die Ergebnisse ein user:[]-Array der Größe 1 anstelle eines Objekts user:{} generieren, kann Folgendes verwendet werden.

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