$lookup result mongodb的计数
将mongodb与NodeJS驱动程序一起使用 我有两个收藏。一个给系里,另一个给学生 Deparmtent的示例数据$lookup result mongodb的计数,mongodb,aggregation-framework,Mongodb,Aggregation Framework,将mongodb与NodeJS驱动程序一起使用 我有两个收藏。一个给系里,另一个给学生 Deparmtent的示例数据 { "_id" : ObjectId("5a24d20590d3d12155f3094e"), "name" : "CSE", "hod" : "abc", "students" : [ ObjectId("5a2129172c3e542acb78c1f5"), ObjectId("5a2129172c3e542acb78c1f7"), Object
{
"_id" : ObjectId("5a24d20590d3d12155f3094e"), "name" : "CSE", "hod" :
"abc",
"students" : [
ObjectId("5a2129172c3e542acb78c1f5"),
ObjectId("5a2129172c3e542acb78c1f7"),
ObjectId("5a2129172c3e542acb78c1f9"),
ObjectId("5a2129172c3e542acb78c1fb")
]
}
{
"_id" : ObjectId("5a24d20590d3d12155f3094f"),
"name" : "IT",
"hod" : "xyz", ,
"students" : [
ObjectId("5a2129172c3e542acb78c1f6"),
ObjectId("5a2129172c3e542acb78c1f8"),
ObjectId("5a2129172c3e542acb78c1fa"),
ObjectId("5a2129172c3e542acb78c1fc")
]
}
以及学生的样本数据
{
"_id" : ObjectId("5a2129172c3e542acb78c1f4"),
"rollNumber" : 11,
"name" : "Thor",
"branch" : ObjectId("5a24d20590d3d12155f3094e"),
}
以下是查询:
aggregate([
{$lookup:
{ from: "students",
localField: "_id",
foreignField: "branch", as: "studentData"
}
}
])
查询的输出
[
{ _id: 5a24d20590d3d12155f3094e,
name: 'CSE',
hod: 'abc',
studentData: [ [Object], [Object], [Object], [Object], [Object] ]
},
{ _id: 5a24d20590d3d12155f3094f,
name: 'IT',
hod: 'xyz',
studentData: [ [Object], [Object], [Object], [Object] ] }
]
我有两个问题
要获取完整的学生数据,您可以执行以下操作
db.student.aggregate(
[
{
$lookup:
{
from:"department",
localField:"branch",
foreignField:"_id",
as:"branch"
}
}
]
)
这将为您提供如下信息:
{
"_id" : 1.0,
"rollNumber" : 110.0,
"name" : "Thor",
"branch" : [
{
"_id" : 1.0,
"name" : "CSE",
"hod" : "abc"
}
]
}
{
"_id" : [
{
"_id" : 2.0,
"name" : "IT",
"hod" : "xyz"
}
],
"numOfStudent" : 1.0,
"listOfStudents" : [
"Ironman2"
]
}
{
"_id" : [
{
"_id" : 1.0,
"name" : "CSE",
"hod" : "abc"
}
],
"numOfStudent" : 3.0,
"listOfStudents" : [
"Thor",
"Ironman",
"Ironman3"
]
}
{
"name" : "CSE",
"hod" : "abc",
"numOfStudents" : 2,
"students" : [
{
"_id" : 1.0,
"rollNumber" : 110.0,
"name" : "Thor",
"branch" : 1.0
},
{
"_id" : 3.0,
"rollNumber" : 111.0,
"name" : "Ironman2",
"branch" : 2.0
}
]
}
aggregate([
{$lookup:
{ from: "students",
localField: "_id",
foreignField: "branch", as: "studentData"
}
}, { $addFields: {studentCount: {$size: "$studentData"}}
}
])
获取每个系的学生数据计数
db.getCollection('student').aggregate(
[
{
$lookup:
{
from:"department",
localField:"branch",
foreignField:"_id",
as:"branch"
}
},
{
$group:
{
_id:"$branch",
"numOfStudent":{$sum:1},
"listOfStudents":{$push:"$name"}
}
}
]
)
这将为您提供如下信息:
{
"_id" : 1.0,
"rollNumber" : 110.0,
"name" : "Thor",
"branch" : [
{
"_id" : 1.0,
"name" : "CSE",
"hod" : "abc"
}
]
}
{
"_id" : [
{
"_id" : 2.0,
"name" : "IT",
"hod" : "xyz"
}
],
"numOfStudent" : 1.0,
"listOfStudents" : [
"Ironman2"
]
}
{
"_id" : [
{
"_id" : 1.0,
"name" : "CSE",
"hod" : "abc"
}
],
"numOfStudent" : 3.0,
"listOfStudents" : [
"Thor",
"Ironman",
"Ironman3"
]
}
{
"name" : "CSE",
"hod" : "abc",
"numOfStudents" : 2,
"students" : [
{
"_id" : 1.0,
"rollNumber" : 110.0,
"name" : "Thor",
"branch" : 1.0
},
{
"_id" : 3.0,
"rollNumber" : 111.0,
"name" : "Ironman2",
"branch" : 2.0
}
]
}
aggregate([
{$lookup:
{ from: "students",
localField: "_id",
foreignField: "branch", as: "studentData"
}
}, { $addFields: {studentCount: {$size: "$studentData"}}
}
])
如果要存储学生的id而不是姓名,可以将$push:$name
更改为$push:$\u id
编辑
使用“部门”集合获得类似结果:
db.department.aggregate([
{
$lookup:
{
from:"student",
localField:"students",
foreignField:"_id",
as:"studentsDetails"
}
},
{
$project:{
_id:0,
name:"$name",
hod:"$hod",
numOfStudents:{$size:"$studentsDetails"},
students:"$studentsDetails"
}
}
])
这将为您提供如下信息:
{
"_id" : 1.0,
"rollNumber" : 110.0,
"name" : "Thor",
"branch" : [
{
"_id" : 1.0,
"name" : "CSE",
"hod" : "abc"
}
]
}
{
"_id" : [
{
"_id" : 2.0,
"name" : "IT",
"hod" : "xyz"
}
],
"numOfStudent" : 1.0,
"listOfStudents" : [
"Ironman2"
]
}
{
"_id" : [
{
"_id" : 1.0,
"name" : "CSE",
"hod" : "abc"
}
],
"numOfStudent" : 3.0,
"listOfStudents" : [
"Thor",
"Ironman",
"Ironman3"
]
}
{
"name" : "CSE",
"hod" : "abc",
"numOfStudents" : 2,
"students" : [
{
"_id" : 1.0,
"rollNumber" : 110.0,
"name" : "Thor",
"branch" : 1.0
},
{
"_id" : 3.0,
"rollNumber" : 111.0,
"name" : "Ironman2",
"branch" : 2.0
}
]
}
aggregate([
{$lookup:
{ from: "students",
localField: "_id",
foreignField: "branch", as: "studentData"
}
}, { $addFields: {studentCount: {$size: "$studentData"}}
}
])
您的$lookup完全正常。要将学生数添加到输出数据中,可以使用$addFields 将此添加到聚合中:
{ $addFields: {studentCount: {$size: "$studentData"}}}
}
因此,您的查询应该是这样的:
{
"_id" : 1.0,
"rollNumber" : 110.0,
"name" : "Thor",
"branch" : [
{
"_id" : 1.0,
"name" : "CSE",
"hod" : "abc"
}
]
}
{
"_id" : [
{
"_id" : 2.0,
"name" : "IT",
"hod" : "xyz"
}
],
"numOfStudent" : 1.0,
"listOfStudents" : [
"Ironman2"
]
}
{
"_id" : [
{
"_id" : 1.0,
"name" : "CSE",
"hod" : "abc"
}
],
"numOfStudent" : 3.0,
"listOfStudents" : [
"Thor",
"Ironman",
"Ironman3"
]
}
{
"name" : "CSE",
"hod" : "abc",
"numOfStudents" : 2,
"students" : [
{
"_id" : 1.0,
"rollNumber" : 110.0,
"name" : "Thor",
"branch" : 1.0
},
{
"_id" : 3.0,
"rollNumber" : 111.0,
"name" : "Ironman2",
"branch" : 2.0
}
]
}
aggregate([
{$lookup:
{ from: "students",
localField: "_id",
foreignField: "branch", as: "studentData"
}
}, { $addFields: {studentCount: {$size: "$studentData"}}
}
])
你到底想在哪里打印数据?你正在打印完整的学生数据,它们只是以数组的形式。你到底想要什么?@AlexP。我希望它不是“[对象]”,而是可读的形式。您的ans正在给出正确的结果。当从“系”集合而不是“学生”集合进行查询时,是否有任何方法可以获取此reuslt?如果在系集合中存储学生ID列表,则可以完成此操作。我尝试了,但无法生成答案。已将学生ID保存在“部门集合”中的数组中。如何继续?你能用新的“部门收集”更新你的问题吗?我已经更新了答案。如果这就是你想要的,请将答案标记为正确!谢谢:)