我想得到我的单一项目的投标在项目的汇总列表。
但是,当我运行Mongodb聚合时,如果它无法为项目的投标找到任何结果,它将返回以下结果:
[ { _id: 5b69f6afa1ad1827cc9e1dc6,
projectID: 100029,
bidsArray: [ { freelanceArray: {} } ]
} ]但是,如果找不到相关的出价,我想返回空的bidsArray (如下所示):
[ { _id: 5b69f6afa1ad1827cc9e1dc6,
projectID: 100029,
bidsArray: []
} ]以下是我的总结:
[
{
$match: {
projectID: projectID
}
},
{
$lookup: {
from: "bids",
localField: "projectID",
foreignField: "projectID",
as: "bidsArray"
}
},
{
$unwind: {
path: "$bidsArray",
preserveNullAndEmptyArrays: true
}
},
{
$lookup: {
from: "users",
localField: "bidsArray.freelanceID",
foreignField: "userID",
as: "freelanceArray"
}
},
{
$unwind: {
path: "$freelanceArray",
preserveNullAndEmptyArrays: true
}
},
{
$group: {
_id: "$_id",
projectID: { $first: "$projectID" },
bidsArray: {
$addToSet: {
bidID: "$bidsArray.bidID",
daysToDone: "$bidsArray.daysToDone",
freelanceArray: {
userID: "$freelanceArray.userID",
username: "$freelanceArray.username",
publicName: "$freelanceArray.publicName",
}
}
}
}
},
{
$project: {
projectID: 1,
bidsArray: {
bidID: 1,
daysToDone: 1,
freelanceArray: {
userID: 1,
username: 1,
publicName: 1,
}
}
}
}
]发布于 2018-08-15 13:12:44
在MongoDB 3.6中,可以在聚合表达式中使用变量$$REMOVE来有条件地抑制字段。
删除最后一个$project阶段,并在$group中更新freelanceArray表达式,如下所示。$cond表达式在出现(非空值)时基本上检查freelanceArray值,输出其他字段,删除freelanceArray。
"freelanceArray":{
"$cond":[
{"$gt":["$freelanceArray",0]},
{"userID":"$freelanceArray.userID","username":"$freelanceArray.username","publicName":"$freelanceArray.publicName"},
"$$REMOVE"]
}https://stackoverflow.com/questions/51855606
复制相似问题