如果Mongo $ lookup是左外部联接,那么它将如何排除不匹配的文档呢?

李新

标题说明了一切。如果一个文档没有根据其匹配字段生成任何匹配的外部文档,那又怎么不将其包含在管道的结果集中呢?

我正在测试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()

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如果值更大,则仅更新 mongo 文档

如果流星的文档中不存在mongo插入对象

如果Mongo中的文档不存在,请添加字段

Mongo聚合:如果没有特定的键,如何从数组中排除它们?

Mongo / Express:如果未传递查询参数,如何返回集合中的所有文档?

如果子文档值不存在,则将Mongo DB插入子文档

Mongo 聚合匹配 + 总和组 - 如果没有匹配则返回 0

如果数组中的所有元素都符合条件,则Mongo删除文档

Mongo C#-更新单个字段(如果未插入文档)

如果未在NodeJS中确认电子邮件,则自动删除Mongo文档

Mongo:如果有任何数组位置与单个查询匹配

如果 Mongo 集合中的特定字段包含特定值,如何仅运行函数?

如果 Mongo 中不存在该字段,您如何填充该字段?

如果宏返回序列而不是列表,它将如何工作?

如果arraylist内部使用Object [] Array,它将如何异构

spring是否会为每个新客户始终创建一个新的IOC容器(如果不是),那么它将如何管理单例bean?

如果联接表中的行之一与条件不匹配,则mysql排除整行

mongodb - 如果不存在,如何在每个数组的元素上插入新的键/值(使用 mongo 查询)

如果没有比较指令,如果不相等,它将如何分支?

在Mongo中,如何根据范围匹配文档?

如果一列的值是A,如果没有,那么该如何获取记录呢?

如果联接不匹配,如何与json_build_object一起返回null?

如果哈希表的所有键都具有相同的值,它将如何工作?

Android Firebase:如果OnCompleteListener在主应用程序线程上调用,它将如何异步工作?

React是否使用requestAnimationFrame吗?如果是这样,它将如何使用它?

如果标记接口没有任何方法,它将如何工作?

如果从未使用过声明中的泛型类型,它将如何真正影响该方法?

如果Perl文件处理程序可以返回多行,它将如何处理标量?

您真的可以在图像文件中获得木马吗?如果可以,它将如何执行?