$lookup
简单连接的语法结构
{
$lookup:
{
from: <collection to join>,
localField: <field from the input documents>,
foreignField: <field from the documents of the "from" collection>,
as: <output array field>
}
}
简单连接的参数解释
语法值 | 解释说明 |
---|---|
from |
同一个数据库下等待被连接的集合。 |
localField |
源集合中的属性名。如果源集合中,某文档没有localField指定的属性,默认会把该属性的值当做null处理。 |
foreignField |
被连接的集合的属性名。如果被连接的集合中,某文档没有localField指定的字段,默认会把该属性的值当做null来处理。 |
as |
连接后给被连接的集合数组命名。如果输入的集合中已存在该值,则会覆盖。 |
简单连接的使用示例
1.构造测试数据
// 构造班级数据
db.class0.insertMany([
{"name": "一年级一班","headmaster": "王老师"},
{"name": "一年级二班","headmaster": "刘老师"},
{"name": "一年级三班","headmaster": "李老师"}
]);
// 获取班级的主键
var classesIds = db.class0.find({},{"_id": 1})
// 构造学生的数据
var studentes = [];
for(var i = 0; i < classesIds.length(); i++){
// 每个班三个学生
for(var j = 0; j < 3; j++){
studentes.push({"name": "学生" + j, "classesId": classesIds[i]._id})
}
}
// 插入学生数据
db.student.insertMany(studentes);
2.使用$lookup连接查询
// 班级连接学生
db.class0.aggregate([
{
"$lookup": {
"from": "student",
"localField": "_id",
"foreignField": "classesId",
"as": "stus"
}
}
])
// 学生连接班级
db.student.aggregate([
{
"$lookup": {
"from": "class0",
"localField": "classesId",
"foreignField": "_id",
"as": "classes"
}
}
])