Estoy haciendo una búsqueda de $ desde un _id. Así que el resultado es siempre 1 documento. Por lo tanto, quiero que el resultado sea un objeto en lugar de una matriz con un elemento.
let query = mongoose.model('Discipline').aggregate([ { $match: { project: mongoose.Types.ObjectId(req.params.projectId) }, }, { $lookup: { from: "typecategories", localField: "typeCategory", foreignField: "_id", as: "typeCategory" } }, { $project: { title: 1, typeCategory: "$typeCategory[0]" } } ]); Esta notación: "$typeCategory[0]" no funciona. ¿Hay alguna forma inteligente de hacer esto?
Puedes simplemente usar $unwind . Deconstruye un campo de matriz de los documentos de entrada para generar un documento para cada elemento
let query = mongoose.model('Discipline').aggregate([ { $match: { project: mongoose.Types.ObjectId(req.params.projectId) }, }, { $lookup: { from: "typecategories", localField: "typeCategory", foreignField: "_id", as: "typeCategory" } }, {$unwind: '$typeCategory'}, { $project: { title: 1, typeCategory: "$typeCategory" } } ]);Puede usar $arrayElemAt en la etapa de $project .
La sintaxis de $arrayElemAt es { $arrayElemAt: [ <array>, <idxexOfArray> ] }
me gusta:
mongoose.model('Discipline').aggregate([ { $match: { project: mongoose.Types.ObjectId(req.params.projectId) }, }, { $lookup: { from: "typecategories", localField: "typeCategory", foreignField: "_id", as: "typeCategory" } }, { $project: { name: 1, typeCategory: {$arrayElemAt:["$typeCategory",0]} } } ]);Use $first para devolver el primer elemento de la matriz:
$project: { title: 1, typeCategory: {$first: "$typeCategory"} }