MongoDB中并没有类似MySQL关系型数据库中Left Join这种连表查询,但是它提供了一个称为aggregate的聚合管道查询语法来让我们实现类似MySQL那样的关联查询。其大致思路就是将多个查询语句按顺序逐一执行,然后汇总结果。
假设我们有两个集合,一个用户集合用来存放用户信息名字叫user,另外一个集合名叫photo用来存放用户的照片信息。
用户集合user
-------------------------
| uid | name |
|-----------|-----------|
| 100000 | A |
| 100001 | B |
| 100002 | C |
-------------------------
照片集合photo
-----------------------------
| uid | photo |
|-----------|---------------|
| 100000 | A的照片一 |
| 100001 | B的照片一 |
| 100000 | A的照片二 |
| 100002 | C的照片一 |
-----------------------------
现在的需求是查出user表中所有用户的照片集合,相同用户的照片需要合并在一个数组中:
查询结果
-------------------------------------------------
| uid | name | photo |
|-----------|---------------|-------------------|
| 100000 | A | A的照片一,A的照片二 |
| 100001 | B | B的照片一 |
| 100002 | C | C的照片一 |
-------------------------------------------------
这时我们就可以联合aggregate语句的$lookup、$unwind、 $project以及$group语法得出想要的结果,查询语句如下:
db.user.aggregate([
{"$lookup": #先用lookup做左关联查询
{
"from": "photo",
"localField": "uid",
"foreignField": "uid",
"as": "pics" #
}
},
{"$unwind":"$pics"},
{"$project":
{
"uid": 1,
"name": 1,
"pics": 1
}
},
{"$group":
{
"_id": "$uid",
"name": {"$first": "$name"},
"photo": {"$first":"$pics"}
}
}
])