如何为学生数组中的每个“ _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"
}
]
}
]
}
我该如何通过聚合操作做到这一点?
答案 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()