Java MongoDb聚合,用于根据同一集合中所有文档的数组对象中存在的ID筛选列表
在我的mongodb中,我有如下数据:Java MongoDb聚合,用于根据同一集合中所有文档的数组对象中存在的ID筛选列表,java,mongodb,mongodb-query,aggregation-framework,aggregation,Java,Mongodb,Mongodb Query,Aggregation Framework,Aggregation,在我的mongodb中,我有如下数据: { "studentId": "a1", "name":"John Doe" "studentsReffered": [ { "course": "BTECH", "students": [ { "st
{
"studentId": "a1",
"name":"John Doe"
"studentsReffered": [
{
"course": "BTECH",
"students": [
{
"studentId": "a2"
},
{
"studentId": "a3"
}
]
},
{
"course": "MTECH",
"students": [
{
"studentId": "a4"
},
{
"studentId": "a5"
}
]
}
]
},
{
"studentId": "a2",
"name":"Joseph"
"studentsReffered": [
{
"course": "BTECH",
"students": [
{
"studentId": "a6"
}
]
}
]
}
上面的JSON包含MongoDB集合中的文档。每个文档包含学生的所有详细信息以及推荐详细信息摘要。i、 e.对于每个学生,都需要一个现场学生,其中包含该学生推荐的所有学生的ID
我想单独显示学生的所有详细信息以及检索单个学生时引用的学生姓名。如下
{
"studentId": "a1",
"name":"John Doe"
"studentsReffered": [
{
"course": "BTECH",
"students": [
{
"studentId": "a2",
"name":"Joseph"
},
{
"studentId": "a3",
"name":"Lorem Ipsum"
}
]
},
{
"course": "MTECH",
"students": [
{
"studentId": "a4",
"name":"Lorem Ipsum"
},
{
"studentId": "a5",
"name":"Lorem Ipsum"
}
]
}
]
}
我已尝试使用mongodb聚合解决此问题。但不幸的是,我无法为此编写查询。因此,我们可以使用聚合实现上述场景。您可以尝试
要创建2个数组,$facet
用户详细信息姓名和学生ID,请在用户
allUsers
迭代循环$project
作为allUsers数组输入$map
输入为studentsReffered数组$map
作为学生数组输入$map
在条件匹配时从$reduce
数组中获取学生的数据用户
解构allUsers阵列$unwind
在根目录中替换allUsers对象$replaceWith
一个问题@turivishal,我有一个问题->如果我想添加更多学生的详细信息,那么我是否需要为每个字段使用$reduce。i、 e.如果我想添加姓名、姓氏、年龄、阶级等。好的,这已经从$reduce中减少了一些分数,您必须在项目中定义
用户
,否则所有都将在$reduce中管理,检查并更正我的答案。如何计算执行mongo db query@turivishal所需的时间。我使用的是以秒为单位显示时间的robo3t。但对于相同的数据,每次在本地主机mongodb上执行时间都会有所不同。
db.collection.aggregate([
{
$facet: {
users: [
{
$project: {
studentId: 1,
name: 1
// add fields as you want it will automatically reflect in join
}
}
],
allUsers: []
}
},
{
$project: {
allUsers: {
$map: {
input: "$allUsers",
in: {
$mergeObjects: [
"$$this",
{
studentsReffered: {
$map: {
input: "$$this.studentsReffered",
in: {
$mergeObjects: [
"$$this",
{
students: {
$map: {
input: "$$this.students",
as: "s",
in: {
$reduce: {
input: "$users",
initialValue: { studentId: "$$s.studentId" },
in: {
$cond: [
{ $eq: ["$$this.studentId", "$$s.studentId"] },
"$$this",
"$$value"
]
}
}
}
}
}
}
]
}
}
}
}
]
}
}
}
}
},
{ $unwind: "$allUsers" },
{ $replaceWith: "$allUsers" }
])