首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当MongoDB聚合无法找到任何结果时,它将返回一个包含空对象的数组

当MongoDB聚合无法找到任何结果时,它将返回一个包含空对象的数组
EN

Stack Overflow用户
提问于 2018-08-15 08:47:23
回答 1查看 391关注 0票数 0

我想得到我的单一项目的投标在项目的汇总列表。

但是,当我运行Mongodb聚合时,如果它无法为项目的投标找到任何结果,它将返回以下结果:

代码语言:javascript
复制
[ { _id: 5b69f6afa1ad1827cc9e1dc6,
    projectID: 100029,
    bidsArray: [ { freelanceArray: {} } ]
} ]

但是,如果找不到相关的出价,我想返回空的bidsArray (如下所示):

代码语言:javascript
复制
[ { _id: 5b69f6afa1ad1827cc9e1dc6,
    projectID: 100029,
    bidsArray: []
} ]

以下是我的总结:

代码语言:javascript
复制
[
        {
            $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,
                    }
                }
            }
        }
    ]
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-15 13:12:44

在MongoDB 3.6中,可以在聚合表达式中使用变量$$REMOVE来有条件地抑制字段。

删除最后一个$project阶段,并在$group中更新freelanceArray表达式,如下所示。$cond表达式在出现(非空值)时基本上检查freelanceArray值,输出其他字段,删除freelanceArray。

代码语言:javascript
复制
"freelanceArray":{
  "$cond":[
    {"$gt":["$freelanceArray",0]},
    {"userID":"$freelanceArray.userID","username":"$freelanceArray.username","publicName":"$freelanceArray.publicName"},
    "$$REMOVE"]
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51855606

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档