问题描述
我有一个动态模型“对话”模型,其中称为“讲座”的字段有时可用有时不可用,并且在不同的 nodejs 服务器上定义了 Lecture 模型。我也想在对话框中填充讲座的结果。所以我尝试使用 populate 但它给出了一个 Schema not register 错误。所以我试图使用 $lookup 来连接来自不同集合的数据。但是,Aggregate 方法返回一个数组,我需要一个对象。我曾尝试使用 arr[0] 使用索引零进行访问。但是我在 Dialog 模型上定义了一个方法。当我尝试访问它时会引发错误。
const resp = await DialogModel.aggregate([
{
$match: {
$and: query
}
},{
$lookup: {
from: "lectures",localField: "lecture",foreignField: "_id",as: "lectureDetail"
}
},{
$unwind: {
path: "$lectureDetail",preserveNullAndEmptyArrays: true
}
}
]);
这是最新的:
[
{
_id: 60ab86e1671c602015741955,lecture: 607d4d3de9b8be1f29e56e94,lectureDetail: {
_id: 607d4d3de9b8be1f29e56e94,course: 6076ba3a01060327b3231a3c,owner: 607434cd63b75949f61cc065,name: 'Lecture 11',startDate: 2021-05-24T07:00:00.000Z,endDate: 2021-05-24T08:00:00.000Z
}
}
]
这是预期的输出:
{
_id: 60ab86e1671c602015741955,lectureDetail: {
_id: 607d4d3de9b8be1f29e56e94,endDate: 2021-05-24T08:00:00.000Z
}
}
如果我尝试使用索引获取访问权限,并在其上调用方法。方法通过错误定义在我的模型上不是函数。
解决方法
聚合方法总是以数组的形式返回结果,而不是单个对象。
您可以通过 ==> resp[0]
访问您的第一个对象