$lookup result mongodb的计数

$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

将mongodb与NodeJS驱动程序一起使用

我有两个收藏。一个给系里,另一个给学生

Deparmtent的示例数据

{ 
 "_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保存在“部门集合”中的数组中。如何继续?你能用新的“部门收集”更新你的问题吗?我已经更新了答案。如果这就是你想要的,请将答案标记为正确!谢谢:)