标题说明了一切.如果一个文档没有根据其匹配字段生成任何匹配的外部文档,那么为什么它不包括在管道的结果集中?

我正在测试Mongo 3.2中的新聚合器,我甚至通过首先展开,然后分组备份文档来执行嵌套数组查找.我所剩下的就是让结果包括所有不符合$lookup个标准的本地文档,这就是我所认为的"左外连接"的标准定义.

问题是:

db.users.aggregate([
    {
        $unwind: "$profile",
        $unwind: "$profile.universities"
    },
    {
        $lookup: {
            from: "universities",
            localField: "profile.universities._id",
            foreignField: "_id",
            as: "profile.universities"
        }
    },
    {
        $group: {
            _id: "$_id",
            universities: {
                $addToSet: "$profile.universities"
            }
        }
    }
]).pretty()

因此,如果我有一个user,它有一个空的profile.universities数组,那么我需要将它包括在结果集中,而不管$lookup返回任何匹配项,但它没有.我怎么能做到这一点,以及Mongo建造$lookup以这种方式运行的任何原因?

推荐答案

这种行为与$lookup无关,因为$unwind的默认行为是省略引用字段缺失或空数组的文档.

要在profile.universities为空数组的情况下保留展开的文档,可以将其preserveNullAndEmptyArrays选项设置为true:

db.users.aggregate([
    {
        $unwind: "$profile",
        $unwind: {
            path: "$profile.universities",
            preserveNullAndEmptyArrays: true
        }
    },
    {
        $lookup: {
            from: "universities",
            localField: "profile.universities._id",
            foreignField: "_id",
            as: "profile.universities"
        }
    },
    {
        $group: {
            _id: "$_id",
            universities: {
                $addToSet: "$profile.universities"
            }
        }
    }
]).pretty()

Mongodb相关问答推荐

如何$匹配在命令列表中查找确切的命令

从两个相连的文件中获取电话和邮箱的渠道是什么?

如何使用ID数组对一个集合中的金额求和并更新另一个集合中的字段?

如何使用聚合管道查找未销售但存在于产品详细信息集合中的产品的ID

在服务器上部署后端时判断??=默认判断

Mongoose 聚合和多级组

仅当特定字段存在于 MongoDB 中时才更新它

如何在 MongoDB 中对字段进行自定义排序

如何过滤查找mongodb的结果

在亚马逊 EC2 上托管 nodeJS/mongoose Web 应用程序

无法让 Mongoose.js 子文档数组填充

Mongo C#忽略属性

什么是 Mongoose (Nodejs) 复数规则?

mongodb,pymongo,aggregate聚合给出奇怪的输出

Docker 内部的 Mongo 身份验证

MongoDB count() 未定义

REACT 获取发布请求

如何使用 MongoDB Compass 对数据进行排序

在 mongodb 中插入当前日期时间

Mongodb Compass 无法在 Ubuntu 18.10 中打开