Javascript 将$lookup结果转换为对象而不是数组
我正在从一个_id进行$lookup。因此结果总是1个文档。因此,我希望结果是一个对象,而不是一个包含一个项的数组Javascript 将$lookup结果转换为对象而不是数组,javascript,node.js,mongodb,mongoose,Javascript,Node.js,Mongodb,Mongoose,我正在从一个_id进行$lookup。因此结果总是1个文档。因此,我希望结果是一个对象,而不是一个包含一个项的数组 let query = mongoose.model('Discipline').aggregate([ { $match: { project: mongoose.Types.ObjectId(req.params.projectId) }, }, { $lookup: { from: "
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]"
}
}
]);
此符号:“$typeCategory[0]”
不起作用。有什么聪明的方法可以做到这一点吗?你可以直接使用。它从输入文档中解构一个数组字段,为每个元素输出一个文档
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"
}
}
]);
您可以在$project
阶段中使用
$arrayElemAt
的语法是{$arrayElemAt:[,]}
比如:
用于合并两个集合:
{$replaceRoot: { newRoot: { $mergeObjects: [ { $arrayElemAt: [ "$typeCategory", 0 ] }, "$$ROOT" ] } } },
{ $project: { typeCategory: 0 } }
暂时使用
typeCategory:{$arrayElemAt:[“$typeCategory”,0]}
。这里有专门解决这个问题的票证。请注意,只有在投影中不排除属性时,此语法才有效。在您的示例中,如果name设置为0,您将得到一个错误的投影,只需在此处指出$unwind中使用的$typeCategory是返回到此处的名称(如:“typeCategory”),而不是localField的名称。
{$replaceRoot: { newRoot: { $mergeObjects: [ { $arrayElemAt: [ "$typeCategory", 0 ] }, "$$ROOT" ] } } },
{ $project: { typeCategory: 0 } }