AI生成的MongoDB数据库LOGO

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"}
	}
}
])