使用 $lookup mongodb 填充到深层

2023-12-27

我正在使用 $lookup 加入两个集合并从以下查询中获取数据:

let condition = {status:{$ne:config.PROJECT_STATUS.completed}, assignId:mongoose.Types.ObjectId(req.params.id)};
Project.aggregate([
    {
      $match: condition  
    },
    {
      "$group":{
        "_id": "$_id"
      }
    },
    { 
      "$lookup": {
        "from": "worksheets",
        "let": { "projectId": "$_id" },
        "pipeline": [
          { "$match": { "$expr": { "$eq": [ "$projectId", "$$projectId" ] }}},
          { "$group": {_id:"$projectId", totalHours:{"$sum": "$hours"}}},
          { 
            "$lookup": {
              "from": "projects",
              "let": { "projectId": "$_id" },
              "pipeline": [
                { "$match": { "$expr": { "$eq": [ "$_id", "$$projectId" ] }}},
                { "$project": { "projectName": 1,"upworkdId":1,"status":1,"developers":1,"hoursApproved":1 }}
              ],
              "as": "project"
            }
          }
        ],
        "as": "projects"
      }
    }
])
.then((data)=>{
    res.json(data);
})

上面的查询给了我以下结果:

[
  {
    "_id": "5c0a4083753a321c6c4ee024",
    "projects": [
        {
            "_id": "5c0a4083753a321c6c4ee024",
            "totalHours": 11,
            "project": [
                {
                    "_id": "5c0a4083753a321c6c4ee024",
                    "hoursApproved": 24,
                    "developers": [
                        "5c0a29c697e71a0d28b910a9"
                    ],
                    "projectName": "fallbrook winery",
                    "status": "pending"
                }
            ]
        }
    ]
  }
]

现在我想填充开发商里面的子字段project大批。我如何修改上面的代码才能得到它。


您可以使用$lookup https://docs.mongodb.com/manual/reference/operator/aggregation/lookup/更深入的一层developers array.

像这样的东西

Project.aggregate([
  { "$match": condition },
  { "$group": { "_id": "$_id" }},
  { "$lookup": {
    "from": "worksheets",
    "let": { "projectId": "$_id" },
    "pipeline": [
      { "$match": { "$expr": { "$eq": ["$projectId", "$$projectId"] } } },
      { "$group": { "_id": "$projectId", "totalHours": { "$sum": "$hours" } }},
      { "$lookup": {
        "from": "projects",
        "let": { "projectId": "$_id" },
        "pipeline": [
          { "$match": { "$expr": { "$eq": ["$_id", "$$projectId"] } } },
          { "$lookup": {
            "from": "developers",
            "let": { "developers": "$developers" },
            "pipeline": [
              { "$match": { "$expr": { "$in": ["$_id", "$$developers"] } } },
            ],
            "as": "developers"
          }},
          { "$project": { 
            "projectName": 1, "upworkdId": 1, "status": 1, "developers": 1,  "hoursApproved": 1
          }}
        ],
        "as": "project"
      }}
    ],
    "as": "projects"
  }}
])
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 $lookup mongodb 填充到深层 的相关文章

随机推荐

  • Powershell:无法与 .Net 程序集中存储的表单交互

    我只是想学习这个东西 并且将来想在我的一个项目中使用它 我有一个带有简单文本框的小表单 存储在 Net dll C 中 这是我在这个 dll 中的类 其中包含与此表单交互的方法 using System using System Colle
  • 按 HSV/HSB 对颜色列表进行排序

    我希望按 HSV HSB 值对很长的颜色列表进行排序 我想按色调 周六 亮度对它们进行排序 实际上 我需要的是一种方法来根据 HSV 的顺序判断一种颜色是出现在 之前 还是 之后 因为我只是要在 Java 中创建一个compareTo 并使
  • 将内容部署到多个服务器 (EC2)

    我一直在开发基于云 AWS EC2 的 PHP Web 应用程序 当涉及到使用多个服务器 全部在 AWS 弹性负载均衡器下 时 我遇到了一个问题 在一台服务器上 当我上传最新文件时 它们会立即在整个应用程序中投入使用 但当使用多个服务器时
  • django.core.exceptions.ImproperlyConfigured:加载 MySQLdb 模块时出错:

    我正在关注 django 教程 很多人都问过这个问题 但我认为我的情况有点独特 因为安装 python mysql 后 当我尝试执行 python manage pysyncdb 时 我仍然收到此错误 我在 virtualenv 中 因为我
  • 从数组中选取随机字符串

    我如何从数组中随机选择一个字符串 但不选择相同的字符串两次 string names image1 png image2 png image3 png image4 png image5 png 这可能吗 我正在考虑使用 return st
  • 从指向某个成员的指针获取指向对象的指针

    假设有一个结构 struct Thing int a bool b 我得到一个指向成员的指针b该结构的 例如某个函数的参数 void some function bool ptr Thing thing 如何获得指向包含对象的指针 最重要的
  • grunt 任务完成后运行命令?

    我想要运行命令 https stackoverflow com questions 10456865 running a command in a grunt task but after任务在咕噜声中完成 uglify compile o
  • 如果实现 __getattribute__ 有没有办法访问形式参数

    好像 getattribute 只有 2 个参数 self name 然而 在实际的代码中 我拦截的方法实际上带有参数 无论如何可以访问这些参数吗 Thanks Charlie 获取属性 只是返回所请求的属性 如果是方法 则返回 call
  • 从其他进程读取和写入

    我希望能够从另一个进程的内存中读取和写入 我调用了这些函数Readprocessmemory and WriteProcessmemory from Kernel32 dll我用了GetProcessByName 函数来查找进程 这样就成功
  • 如何从 Rails 控制台使用 Devise 登录用户?

    加载Rails控制台后 我应该如何登录用户 Devise 提供了一个可以在测试中使用的测试助手 我尝试在控制台中使用 gt gt include Devise TestHelpers gt gt helper sign in User fi
  • 如何将异常从一个进程传递到另一个进程?

    如果停止函数中的运行状态为 停止 我想在上传函数中引发异常 这似乎不起作用 我正在使用 Pipe 来传递异常 怎么了 def upload instances u1 for instance in instance try u1 recv
  • iOS/Android 检测和重定向

    js新手 慢慢来 D 需要根据用户使用的操作系统进行重定向 如果ios重定向到x 如果android重定向到y 否则 留在原来的地址 我的问题 这些片段够了吗
  • 从 Shell 输出生成文档

    有没有一种方法 工具可以直接从我的 Shell 输出甚至保存的日志生成 HTML 文档 类似于 doxygen 的作用 如果没有可用的东西 你们对如何使用现有工具做到这一点有什么创意吗 我想 在打字时 我可以放置某种标记或特殊字符 然后让一
  • C# 从一个列表中减去另一个列表或检查一个列表是否完全包含在另一个列表中

    如何从一个列表中减去另一个列表 List
  • Python 3.5+ 中类型提示的动态检查[重复]

    这个问题在这里已经有答案了 The typing https docs python org 3 library typing html模块在 Python 3 5 中实现类型提示 然而 这并不是强制执行的 它目前似乎只是为了静态类型检查器
  • 在 Google People API 中未给出的特定时间后更新联系人条目的选项

    我们使用 Google Contacts API 获取在特定时间后更新的联系人条目 以便在我们端保留联系人的更新副本 在 Google Contacts API 中 有一个选项可以使用以下命令在特定时间后更新联系人条目 更新分钟 https
  • 使用 Python 识别 Mac OS X 中的包目录

    Mac OS X Finder 使用 包 的概念使某些文件夹的内容对用户不透明 我在用着os walk 枚举目录树 并且我想跳过对应用程序包等包的枚举 The mdls命令行实用程序可用于检查是否com apple package在里面kM
  • XSL:只有文件名,没有路径

    我是 XSL 编程新手 我想这是一个简单的问题 如何获取没有路径的文件名 目前我的代码如下所示 我得到了整个路径 结果 xml
  • Spring集成测试不回滚

    我正在使用 Spring Hibernate H2 我在集成测试中执行数据库操作 通过调用服务类 我希望 Spring 在每个测试方法之后回滚更改 但我无法让它工作 起初我使用MySQL 带有MyISAM 不支持事务 但是换成H2后问题仍然
  • 使用 $lookup mongodb 填充到深层

    我正在使用 lookup 加入两个集合并从以下查询中获取数据 let condition status ne config PROJECT STATUS completed assignId mongoose Types ObjectId