要实现与SQL类似的查询,你需要使用聚合框架(Aggregation Framework)
SELECT b.name, a.*
FROM user a
LEFT JOIN order b
ON a.id = b.id
WHERE b.name LIKE '%acd%';
从MongoDB 3.2版本开始,引入了聚合框架中的$lookup
阶段,这使得实现类似于SQL中的JOIN查询成为可能。下面我将详细介绍如何使用$lookup
来进行连表查询。
假设你有两个集合:users
和 orders
。users
集合包含用户信息,orders
集合包含订单信息。每个订单都包含一个用户ID (userId
),用于关联用户
users 集合
{
"_id": ObjectId("5f46e7b0f7c3a82a7c78d4ee"),
"name": "Alice",
"email": "alice@example.com"
}
orders 集合
{
"_id": ObjectId("5f46e7b0f7c3a82a7c78d4ef"),
"userId": ObjectId("5f46e7b0f7c3a82a7c78d4ee"),
"total": 123.45
}
使用 $lookup
连接两个集合
假设你想获取每个用户及其关联的所有订单,你可以使用以下聚合查询:
db.users.aggregate([
{
$lookup: {
from: "orders", // 被连接的集合
localField: "_id", // 当前集合中的字段
foreignField: "userId", // 被连接集合中的字段
as: "orders" // 结果集合的数组字段
}
},
{
$project: {
_id: 1,
name: 1,
email: 1,
orders: 1
}
}
])
这里的步骤说明如下:
-
$lookup: 这个阶段实现了连接操作。它会查找
orders
集合中userId
与users
集合中的_id
相匹配的文档,并将匹配的结果作为数组添加到输出文档的orders
字段中。 -
$project: 这个阶段用于选择输出的字段。在这里我们选择了
_id
,name
,email
以及orders
字段。
处理左连接 (Left Join)
如果你想要模拟SQL中的左连接(即使某些用户没有订单也要包括他们),可以在$lookup
之后使用$match
或$project
来处理那些没有匹配项的情况。
例如,如果你想显示没有订单的用户:
db.users.aggregate([
{
$lookup: {
from: "orders",
localField: "_id",
foreignField: "userId",
as: "orders"
}
},
{
$project: {
_id: 1,
name: 1,
email: 1,
orders: 1
}
},
{
$addFields: {
hasOrders: { $size: "$orders" }
}
},
{
$sort: { hasOrders: 1 }
}
])
在这个例子中,$addFields
添加了一个新字段hasOrders
,它表示用户是否有订单。$sort
阶段按是否有订单排序。
总结
$lookup
允许你基于两个集合中的字段进行连接。- 可以使用
$project
来选择输出哪些字段。 - 使用
$addFields
和$sort
可以帮助你处理没有匹配项的情况。
postman下载地址Download Postman | Get Started for Free
使用get发起请求
使用post发起请求