mongodb - 根据 MongoDB 中的值进行条件 $lookup 吗?
问题描述
我在 MongoDB 4.0 (pymongo) 中有三个集合
users: [
{name: "John", user_type: "client", society: 1},
{name: "Charles", user_type: "client", society: 1},
{name: "Jessy", user_type: "provider", society: 1},
{name: "Tim", user_type: "provider", society: 2}
]
clients: [
{_id: 1, name: "Client1"}
]
providers: [
{_id: 1, name: "Provider1"},
{_id: 2, name: "Provider2"}
]
我需要根据user_type
值在用户和客户端或提供者之间进行连接,并将其设置为结果中的相同键值。
例如,结果将是:
user : {name: "John", user_type: "client", society: 1, complete_society: {_id: 1, name: "Client1"}}
or
user : {name: "Tim", user_type: "provider", society: 2, complete_society: {_id: 2, name: "Provider2"}}
我现在唯一的解决方案是$lookup
在两个不同的键中执行两个不同的操作,然后在请求后重新处理结果
db.users.aggregate([{
"$lookup": {
"from": "clients",
"localField": "society",
"foreignField": "_id",
"as": "client"
}
},
{"$unwind": "$clients"},{
"$lookup": {
"from": "providers",
"localField": "society",
"foreignField": "_id",
"as": "provider"
}
},
{"$unwind": "$providers"}]);
然后做一个 forEach 并设置一个键complete_society
并删除以前的键。这不是完美的方式,也许在 mongo 中,有一些东西可以做到这一点。
解决方案
您可以按以下方式更改您的查询以达到您的预期结果,
- 删除
$unwind
阶段 $project
显示必填字段$arrayElemAt
从查找结果中获取第一个元素$cond
检查user_type
是“客户端”然后返回client
数组,否则返回provider
数组
db.users.aggregate([
{
$lookup: {
from: "clients",
localField: "society",
foreignField: "_id",
as: "client"
}
},
{
$lookup: {
from: "providers",
localField: "society",
foreignField: "_id",
as: "provider"
}
},
{
$project: {
name: 1,
society: 1,
user_type: 1,
complete_society: {
$arrayElemAt: [
{
$cond: [{ $eq: ["$user_type", "client"] }, "$client", "$provider"]
},
0
]
}
}
}
])
推荐阅读
- c# - 如何在 ASP.NET Core 3.1 中使用参数进行路由
- python - TypeError:add_info()缺少1个必需的位置参数:Flask中的'writer'
- azure-active-directory - 如何使用 Graph API 获取 SharePoint 用户配置文件
- excel - Excel 2010 显示了一个糟糕的数学结果。有人可以解释我为什么吗?
- javascript - 反应光滑的滑块不通过道具
- c - 使用叉子和管道检查数字是否为素数
- swift - 为什么我会在 SCNNode 之间发生连续冲突?
- python - Python 正则表达式条件,不匹配 if
- javascript - 间接调用函数时成员未定义
- python - 如何让硒等待