Javascript 将$lookup结果转换为对象而不是数组

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: "

我正在从一个_id进行$lookup。因此结果总是1个文档。因此,我希望结果是一个对象,而不是一个包含一个项的数组

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 } }