$lookup 在数组中的 ObjectId 并将其投影到同一个数组

普拉纳万·杰加西瓦兰

我有一个类架构如下

const AttendanceSchema = new mongoose.Schema({
    date: Date,
    records: [{
        studentId: {
            type: mongoose.Schema.Types.ObjectId,
            ref: 'User'
        },
        attendance: Boolean
    }]
})

var ClassSchema = new mongoose.Schema({
    title: String,
    description: String,
    attendances: [AttendanceSchema]
});

这里我有考勤对象来维持班级学生的出勤率。因此,每天,每当我们从课堂上出勤时,我们都可以 $push 一个带有日期和出勤记录详细信息的对象。一个 Class 对象看起来像这样

{
    title: "Class Name",
    description: "Description",
    attendances: [
    {
        _id: "60ed395fb06f1254b0771ce1",
        date: "2021-07-13T06:57:00.000+00:00",
        records: [
            {
                attendance: true,
                _id: "60ed395fb06f1254b0771ce2",
                studentId: "60e6c440c133a9b590f510d5"
            },
            {
                attendance: false,
                _id: "60ed395fb06f1254b0771ce3",
                studentId: "60e6c4cb7be1ce4b647c546f"
            }
        ]
    },
    {
        _id: "60ed395fb06f1254b0771ce4",
        date: "2021-07-14T06:57:00.000+00:00"
        records: [
            {
                attendance: true,
                _id: "60ed395fb06f1254b0771ce5",
                studentId: "60e6c440c133a9b590f510d5"
            },
            {
                attendance: true,
                _id: "60ed395fb06f1254b0771ce6",
                studentId: "60e6c4cb7be1ce4b647c546f"
            }
        ]
    }
    ]
}

在这里您可以看到每个记录对象都包含一个带有对象 ID 的对象。我想以相同的格式获取学生的详细信息所需的输出

title: "Class Name"
description: "Description"
attendances: [
   {
      _id: 60ed395fb06f1254b0771ce1
      date: 2021-07-13T06:57:00.000+00:00
      records: [
         {
            attendance: true
            _id: 60ed395fb06f1254b0771ce2
            studentId: 60e6c440c133a9b590f510d5
            _studentDetail: {
               name: "Name"
               detail: ...
            }
         },
         {
            attendance: false
            _id: 60ed395fb06f1254b0771ce3
            studentId: 60e6c4cb7be1ce4b647c546f
         }
      ]
   },
   ...
]

如果我使用 $lookup,我只能在单独的对象中获取学生详细信息。我怎么才能得到它?

米克尔

由于您的数据结构是深度嵌套的,因此您需要studentIds在运行$lookup之前提取所有数据结构$降低与运营商一起$ addFields可以使用它。

从第二个集合中获取所有学生后,每个文档中都有两个数组:studentsattendances然后,您需要通过运行多个$map运算符以及$mergeObjects$filter来合并它们,以获得每个匹配的学生record

db.Attendance.aggregate([
    {
        $addFields: {
            students: {
                $reduce: {
                    input: "$attendances",
                    initialValue: [],
                    in: { $setUnion: [ "$$value", "$$this.records.studentId" ] }
                }
            }
        }
    },
    {
        $lookup: {
            from: "Students",
            localField: "students",
            foreignField: "_id",
            as: "students"
        }
    },
    {
        $project: {
            title: 1,
            description: 1,
            attendances: {
                $map: {
                    input: "$attendances",
                    as: "a",
                    in: {
                        $mergeObjects: [
                            "$$a",
                            {
                                records: {
                                    $map: {
                                        input: "$$a.records",
                                        as: "r",
                                        in: {
                                            attendance: "$$r.attendance",
                                            _id: "$$r._id",
                                            student: {
                                                $arrayElemAt: [
                                                    { $filter: { input: "$students", cond: { $eq: [ "$$this._id", "$$r.studentId" ] } } }
                                                    , 0
                                                ]
                                            }
                                        }
                                    }
                                }
                            }
                        ]
                    }
                }
            }
        }
    }
])

蒙戈游乐场

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在数组中的ObjectId上的$ lookup

$ lookup在数组中的ObjectId上不起作用

对象数组中的ObjectId的$ lookup(猫鼬)

在数组中的ObjectId上查找

如何通过Pymongo在数组中附加ObjectID?

MongoDB:使$ lookup将其输出放在数组内的对象中

从objectId数组中删除一个ObjectId

猫鼬不会在数组的objectid中填充objectid

MongoDb $ lookup在数组字段中嵌套文档

两个集合的 ObjectId 的简单 $lookup“左连接”在 Mongo DB 中不起作用

MongoDB如何检查数组内的所有ObjectId是否在数据库中存在?

一个ObjectId数组中的Mongoose indexOf

追加的ObjectId数组

如何在数组中搜索一个元素然后从同一个数组中输出另一个元素?

如何在数组的字段中执行 $lookup 并在同一查询中添加外部表的内容?

MongoDB Join _id 字段从 String 到 ObjectId 聚合 $lookup

嵌套数组中的$ lookup

$ lookup对象数组中的id

猫鼬从数组中拉ObjectId

在聚合函数中搜索 ObjectId 数组的问题

使用更新 mongoDB 从 objectId 数组中删除

节点/猫鼬-从数组中删除ObjectId

mongo用数据替换数组中的ObjectId

mongodb 不会从 ObjectId 数组中删除元素

搜索对象数组以匹配mongodb中的objectId

$ lookup结果使用另一个数组中的键排序

在4个集合之间进行$ Lookup,其中3个具有ObjectId,第四个是String生成空数组

如何计算小计并将其添加到同一个数据框中?

在数组列表中存储同一个父类的两个子类