我有两个模式:bucLaunch-将businessUseCase关系存储到其他businessUseCases的位置。和businessUseCase模式,其中是有关businessUseCase的信息(名称,描述,状态等)。一个businessUseCase可以与其他businessUseCase具有多个关系,我需要获取状态不在“关闭”状态并且bucLaunch.businessUseCase等于businessUseCase._id的特定ID的businessUseCases列表。
我只是到了这一点,我不知道为什么,但是聚合仍然返回“关闭”状态。
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的所有相关businessUseCases怎么办?如果我想获取特定businessUseCase(id:111111111111111111111111111)的数据,我希望得到如下结果:
{
"_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"
},
...
]
}
答案 0 :(得分:0)
问题出在聚合管道的最后阶段($match
)
{
$match: { "output.state": { $ne: ["closed"] } }
}
在这里,您尝试将state
与["closed"]
(是一个数组)进行匹配,这就是为什么它与带有state : "closed"
的文档不匹配,并且它也返回它们的原因。您应该尝试将其与“ closed”(字符串)匹配
在$ match阶段尝试:
{
$match: { "output.state": { $ne: "closed" } }
}
它应该为您工作。希望对您有帮助!
或者,如果要与一个或多个字符串(Array of strings)
匹配,则应使用$nin
而不是$ne
:
{
$match: { "output.state": { $nin: ["closed"] } }
}