数组中每个“ _id”的别名

时间:2019-09-13 06:51:32

标签: arrays node.js mongodb

如何为学生数组中的每个“ _id”设置别名。 我想在此json输出中为_id设置别名。

{
    "items": [
        { 
            "id": "5d7aa7c1cba3435ebcb069c6",
            "start": "2019-01-01T10:00:00.000Z",
            "end": "2019-01-01T10:00:00.000Z",
            "description": "test",
            "students": [
                {
                    "_id": "5d7aa779cba3435ebcb069c5", // <- alias _id to id
                    "name": "Jon",
                    "surname": "Snow"
                }
            ]
        }
    ]
} 

我该如何通过聚合操作做到这一点?

3 个答案:

答案 0 :(得分:1)

在聚合管道中使用本机$map运算符来转换数组。您将需要嵌套两个$map操作;一 items数组和students数组的内部$map

const studentsMap = {
    '$map': {
        'input': '$$this.students',
        'as': 'student',
        'in': {
            'id': '$$student._id',
            'name': '$$student.name',
            'surname': '$$student.surname'
        }
    }
}

db.collection.aggregate([
    { '$addFields': {
        'items': {
            '$map': {
                'input': '$items',
                'in': {
                    'id': '$$this.id',
                    'start': '$$this.start',
                    'end': '$$this.end',
                    'description': '$$this.description',
                    'students': studentsMap
                }
            }
        }
    } }
])

答案 1 :(得分:0)

使用地图进行变换。

items = items.map((item)=>{
  item.students = item.students.map((student)=>{
    student.id = student._id;
    delete student._id;
    return student;
  })
  return item;
})

答案 2 :(得分:0)

一种更好的方法是避免在$ map阶段对字段进行硬编码,因为随着文档大小的增加,此类查询的维护变得很困难。以下查询可以为我们提供预期的输出,并且与文档中存在的字段无关。因为它将只专注于替换_id中存在的items.students

db.collection.aggregate([
    {
        $addFields:{
            "items":{
                $map:{
                    "input":"$items",
                    "as":"item",
                    "in":{
                        $mergeObjects:[
                            "$$item",
                            {
                                "students":{
                                    $map:{
                                        "input":"$$item.students",
                                        "as":"student",
                                        "in":{
                                            $mergeObjects:[
                                                "$$student",
                                                {
                                                    "id":"$$student._id"
                                                }
                                            ]
                                        }
                                    }
                                }
                            }
                        ]
                    }
                }
            }
        }
    },
    {
        $project:{
            "items.students._id":0
        }
    }
]).pretty()