嵌套文档上的 MongoDB $lookup

2024-06-21

我是 mongo 的新手,正在努力应对以下问题。我有 2 个集合,结构如下。对于我的一生,我不知道如何对学校收藏进行 $lookup。阅读其他帖子,我肯定使用 ObjectId 作为参考以及外部字段。

下面是我的结构:

Alumni:

{
    "_id": "john",
    "items": [
        {
            "name": "John",
            "items": [
                {
                    "school": ObjectId("56de35ab520fc05b2fa3d5e4"),
                    "grad": true
                },
                {
                    "school": ObjectId("56de35ab520fc05b2fa00000"),
                    "grad": false
                }
            ]
        },
        {
            "name": "Johnny"
            // notice no nested items, this doc should still be included in result
        },
        {
            "name": "Jon",
            "items": [
                {
                    "school": ObjectId("56de35ab520fc05b2fa11111"),
                    "grad": false
                }
            ]
        }
     ]
}

Schools

{
    _id: ObjectId("56de35ab520fc05b2fa3d5e4"),
    name: "Some University",
    street: "ABC Boulevard"
}

我想要得到什么:

{
    "_id": "john",
    "items": [
        {
            "name": "John",
            "items": [
                {
                    "school": ObjectId("56de35ab520fc05b2fa3d5e4"),
                    "grad": true,
                    "schoolInfo":     {
                        _id: ObjectId("56de35ab520fc05b2fa3d5e4"),
                        name: "Some University",
                        street: "ABC Boulevard"
                    }
                },
                {
                    "school": ObjectId("56de35ab520fc05b2fa00000"),
                    "grad": true,
                    "schoolInfo":     {
                        _id: ObjectId("56de35ab520fc05b2fa00000"),
                        name: "Another University",
                        street: "123 Boulevard"
                    }
                }
            ]
        },
        {
            name: "Johnny"
        },
        {
            "name": "Jon",
            "items": [
                {
                    "school": ObjectId("56de35ab520fc05b2fa11111"),
                    "grad": true,
                    "schoolInfo":     {
                        _id: ObjectId("56de35ab520fc05b2fa11111"),
                        name: "Some University",
                        street: "ABC Boulevard"
                    }
                }
            ]
         }
     ]
}

我尝试过的查询无济于事:

db.alumni.aggregate([
      {$match: {_id: 'john'}}, 
      {$lookup: {
                from: 'schools', 
                localField: 'items.items.school', 
                foreignField: '_id', 
                as: 'schoolInfo'}}
 ])

任何帮助将不胜感激!


在这种情况下,需要在聚合框架中很好地使用 $unwind 和 $project

请看下面:

db.alumni.aggregate([
    {$match: {_id: 'john'}},
    {$unwind:"$items"},
    {$unwind:"$items.items"},
    {$lookup: {
        from: 'schools', 
        localField: 'items.items.school', 
        foreignField: '_id', 
        as: 'schoolInfo'}},
    {$unwind:"$schoolInfo"},
    {$project:{
        "_id":1,
        "items":[{
            "name":"$items.name",
            "items":[{
            "school":"$schoolInfo._id"    ,
            "grad":"$items.items.grad"    ,
            "schoolInfo":"$schoolInfo"
            }]
        }]            
    }}
]).pretty()

看看它是如何工作的 - 尝试从查询中删除聚合阶段并检查文档结构。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

嵌套文档上的 MongoDB $lookup 的相关文章

随机推荐

  • d3.js:将样式应用于单行

    正在尝试可拖动网络 http bl ocks org mbostock 4566102并希望能够对不同的链接使用不同的颜色 当我注释掉这些行时 var link svg append g attr class link selectAll
  • Cython memoryviews:使用数组参数包装 c 函数以传递 numpy 数组

    我正在尝试使用 Cython 用数组参数包装 c 函数 quick sort 所以我可以将 numpy 数组传递给它 我已经在文档 SO 和网络中搜索了一个可行的 最小的示例 但没有找到它 我已经尝试了几种可能性 但没有任何进展 所以请帮我
  • 在网页上发送Apache Kafka数据

    我正在构建一个实时能源监控系统 其中数据来自传感器 每秒都会有新的数据 使用的数据将被聚合并呈现为图表 我研究过大量数据的实时流处理 这让我想到了 Apache Kafka 现在我的网络应用程序正在使用 Express js 我在用kafk
  • 有什么方法可以加快 Postgres 位图堆扫描速度吗?

    这里是数据库新手 这是我的查询 我使用的是 Postgres 9 3 5 explain analyse SELECT SUM actual cost as cost SUM total items as num items process
  • WordPress:tax_query 使用 OR 运算符的多个术语

    简单的查询 但由于某种原因没有显示正确的帖子 尝试显示带有每月待办事项清单术语 如果没有结果 则显示带有社区活动术语的帖子 有什么建议么 todo args array cat gt my category id posts per pag
  • gitbranch --merged 使用管道命令

    有没有办法达到相当于 git branch merged 使用 git 管道命令 我知道有类似的命令git for each ref它为您提供提交哈希值及其相应的引用名称 是否有一个命令可以判断某个提交是否可以从另一个提交访问 这基本上就是
  • 使用 RegEX 在 Notepad++ 中添加前缀和附加

    我在 txt 文件中有相当大的单词列表 我正在尝试在 Notepad 中进行正则表达式查找和替换 我需要在每行之前和之后添加一个字符串 这样 wordone wordtwo wordthree become able wordone abl
  • 禁用 Chrome 开发者工具 ⌘-[0-9] 键盘快捷键?

    Is it possible to disable the 0 9 keyboard shortcuts in Chrome s developer tools It s frustrating to accidentally hit th
  • Javascript - 获取和设置基元的属性隐式创建对象包装器

    我正在读一本书 名叫有效的 JavaScript 利用 JavaScript 力量的 68 种具体方法 第 4 点 Prefer Primitives to Object Wrappers 并遇到这句话 获取和设置基元的属性会隐式创建对象
  • 自动将文本转换为十进制数 - Access

    我正在尝试使用 ODBC 将数据从 MS SQL Server DB 导入到 MS Access 对于大多数数据类型 导入会正确映射类型 但当 SQL Server 列数据类型为十进制数时 MS Access 会将其转换为文本数据类型 因此
  • 如何检测android中的颠倒方向?

    在我的 Android 应用程序中 我有全景图像 并且我使用 TYPE ORIENTATION 传感器根据手机运动旋转该图像 它对于横向和纵向都工作良好 这是旋转逻辑的代码 Override public void onSensorChan
  • REGEX (javascript) - 允许字母数字字符和不在第一个位置的特殊字符

    我想设计一个正则表达式 允许使用字母数字字符以及其他字符 只要它们不在第一个位置即可 例子 VALID Test VALID Hello123 VALID 456 Hi VALID 456 789 VALID Hi 777 VALID 33
  • Andrei Alexandrescu 关于爆炸元组的演讲中奇怪的 result_of

    有人看过 Andrei Alexandrescu 在 GoingNative2013 中关于爆炸元组的演讲吗 这是我不太明白的一段代码 template
  • UICollectionViewCell 拖动预览的自定义视图

    我正在尝试实现一项功能 用户可以将一个集合视图单元格拖放到另一个集合视图单元格上 但是 我想完全更改运动中物体的预览 以匹配我的应用程序的视觉隐喻 该项目没有移动 该项目包含的东西正在移动 例如 假设我的collectionview单元格显
  • OpenCV RGB转灰度

    我正在做一个视频监控项目 我看不到从 RGB 到灰度的转换 我为灰色设置了黑色窗口 你能帮我解决这个问题吗 附代码 另外 如何获得当前帧和前一帧之间的差异 多谢 宜兰 include stdafx h include
  • 如何动态地将节追加到 Symfony 2 配置中?

    my bundle algorithm blowfish One of md5 blowfish sha256 sha512 这个配置是通过这个配置树完成的 Algorithms and constants to check algorit
  • fgetc 无法识别 EOF [重复]

    这个问题在这里已经有答案了 下面的程序在各种 Solaris Linux 版本上运行良好 但在 AIX 上运行不佳 但是 如果我更换while c EOF with while c 0xff 在 AIX 上它运行得很好 有什么想法吗 我检查
  • mysql 版本号排序

    我有这样的价值观 1 1 2 9 1 2 2 4 1 2 3 4 3 2 14 3 2 1 4 2 我需要使用 mysql 对这些值进行排序 该数据类型是 varbinary 300 所需的输出将类似于 1 1 2 1 2 3 4 2 2
  • C++ 相当于 C# 中的 new Random(seed)

    当我们在 C 中使用随机数生成器时 我们可以定义一个变量 例如 private Random rndGenerator 在课堂上然后打电话 rndGenerator new Random seed 正确地在类的构造函数中 我的问题是 这种定
  • 嵌套文档上的 MongoDB $lookup

    我是 mongo 的新手 正在努力应对以下问题 我有 2 个集合 结构如下 对于我的一生 我不知道如何对学校收藏进行 lookup 阅读其他帖子 我肯定使用 ObjectId 作为参考以及外部字段 下面是我的结构 Alumni id joh