mongodb - 使用 $lookup 运算符连接条件
问题描述
我有两个模式: bucLaunch - 将 businessUseCase 与其他 businessUseCases 的关系存储在哪里。以及 businessUseCase 模式,其中包含有关 businessUseCase 的信息(名称、描述、状态等)。一个businessUseCase 可以与其他businessUseCase 有多种关系,我需要获取一个businessUseCase 的列表,该列表的状态未处于“关闭”状态,并且bucLaunch.businessUseCase 等于businessUseCase._id 的特定ID。
我只到了这一点,我不知道为什么,但聚合仍然返回“关闭”状态。
db.getCollection('bucLaunch').aggregate([
{
$addFields: {bucId: {"$toObjectId": "$businessUseCase"}}
},
{
$lookup: {
from: "businessUseCase",
localField: "bucId",
foreignField: "_id",
as: "output"
}
},
{
$unwind: "$output"
},
{
$match: { "output.state": { $ne: ["closed"] } }
}
)]
bucLaunch 对象如下所示:
{
"_id" : ObjectId("5cab7e9063f03228c0c74acf"),
"businessUseCase" : "111111111111111111111111",
"launchingBusinessUseCase" : "222222222222222222222222"
}
和 businessUseCase 对象看起来像这样:
{
"_id" : ObjectId("222222222222222222222222"),
"name" : "Name",
"desc" : "Description",
"state" : "closed"
}
如果会有另一个businessUseCase,例如:
{
"_id" : ObjectId("333333333333333333333333"),
"name" : "Name2",
"desc" : "Description2",
"state" : "inProgress"
}
和另一个关系对象,如:
{
"_id" : ObjectId("5cab7e9063f03228c0c74acf"),
"businessUseCase" : "111111111111111111111111",
"launchingBusinessUseCase" : "333333333333333333333333"
}
我只期望这样的未关闭状态的businessUseCase列表:
[{
"_id" : ObjectId("333333333333333333333333"),
"name" : "Name2",
"desc" : "Description2",
"state" : "inProgress"
}]
那么,如果我想获取一个特定业务用例的所有相关业务用例怎么办?如果我想获取特定 businessUseCase 的数据(id:111111111111111111111111),我希望得到如下结果:
{
"_id" : ObjectId("111111111111111111111111"),
"name" : "Name1",
"desc" : "Description1",
"state" : "closed",
"notClosedRelatedBucList": [
{
"_id" : ObjectId("222222222222222222222222"),
"name" : "Name2",
"desc" : "Description2",
"state" : "inProgress"
},
{
"_id" : ObjectId("444444444444444444444444"),
"name" : "Name2",
"desc" : "Description2",
"state" : "inProgress"
},
...
]
}
解决方案
问题$match
出在聚合管道的最后阶段 ( ):
{
$match: { "output.state": { $ne: ["closed"] } }
}
在这里,您尝试匹配state
(["closed"]
这是一个数组),这就是为什么它与文档不匹配state : "closed"
并且它也返回那些。您应该尝试将其与“关闭”(字符串)匹配
在 $match 阶段试试这个:
{
$match: { "output.state": { $ne: "closed" } }
}
它应该适合你。希望能帮助到你!
或者如果你想匹配一个或多个字符串(Array of strings)
,你应该使用$nin
而不是$ne
:
{
$match: { "output.state": { $nin: ["closed"] } }
}
推荐阅读
- html - 当我已经使用 ng-model 和 ng-value 时,我想用后面的数据检查我的单选按钮
- mysql - 选择 product_id 最低的所有行
- python - 如何在 Windows 中使用 git bash 和 npm 安装 python
- jenkins - Kubernetes 自定义 jenkins 图表抛出与 override_config_map 相关的错误
- python-3.x - 生成器函数导致在所有进程完成后捕获异常
- android - 如何将 QR 码结果发送到 TextView?
- go - 创建用于解组以下 yaml 文件的 go 结构的更好方法是什么?
- python - 从裁剪区域中提取像素数
- azure-devops - 使用 Azure Pipelines 将用户名和密码添加到 yaml 配置文件
- go - 服务器关闭请求流时如何关闭 HTTP/2 客户端流?