在 MongoDB 中,查询两个集合之间的关系通常涉及到使用 $lookup
聚合操作符来进行集合联接(类似于 SQL 中的 JOIN 操作)。以下是一个详细的步骤指南,展示如何在 MongoDB 中进行两个集合之间的查询。
假设我们有两个集合:users
和 orders
。
users
集合[
{ "_id": 1, "name": "Alice" },
{ "_id": 2, "name": "Bob" },
{ "_id": 3, "name": "Charlie" }
]
orders
集合[
{ "_id": 101, "userId": 1, "product": "Laptop" },
{ "_id": 102, "userId": 2, "product": "Phone" },
{ "_id": 103, "userId": 1, "product": "Tablet" }
]
$lookup
进行联接我们希望查询 users
集合,并联接 orders
集合,以便获取每个用户的订单信息。
db.users.aggregate([
{
$lookup: {
from: "orders", // 目标集合
localField: "_id", // 本地集合中的字段
foreignField: "userId", // 目标集合中的字段
as: "orders" // 输出数组的字段名
}
}
])
[
{
"_id": 1,
"name": "Alice",
"orders": [
{ "_id": 101, "userId": 1, "product": "Laptop" },
{ "_id": 103, "userId": 1, "product": "Tablet" }
]
},
{
"_id": 2,
"name": "Bob",
"orders": [
{ "_id": 102, "userId": 2, "product": "Phone" }
]
},
{
"_id": 3,
"name": "Charlie",
"orders": []
}
]
你可以在 $lookup
之后添加更多的聚合阶段来进一步过滤和处理数据。例如,假设我们只想获取有订单的用户:
db.users.aggregate([
{
$lookup: {
from: "orders",
localField: "_id",
foreignField: "userId",
as: "orders"
}
},
{
$match: {
"orders": { $ne: [] } // 过滤掉没有订单的用户
}
}
])
[
{
"_id": 1,
"name": "Alice",
"orders": [
{ "_id": 101, "userId": 1, "product": "Laptop" },
{ "_id": 103, "userId": 1, "product": "Tablet" }
]
},
{
"_id": 2,
"name": "Bob",
"orders": [
{ "_id": 102, "userId": 2, "product": "Phone" }
]
}
]
$project
选择字段你可以使用 $project
阶段来选择需要的字段。例如,只选择用户的名字和订单的产品信息:
db.users.aggregate([
{
$lookup: {
from: "orders",
localField: "_id",
foreignField: "userId",
as: "orders"
}
},
{
$project: {
_id: 0,
name: 1,
"orders.product": 1
}
}
])
[
{
"name": "Alice",
"orders": [
{ "product": "Laptop" },
{ "product": "Tablet" }
]
},
{
"name": "Bob",
"orders": [
{ "product": "Phone" }
]
},
{
"name": "Charlie",
"orders": []
}
]
领取专属 10元无门槛券
手把手带您无忧上云