请看这个魔域playground ::mongoplayground

在这里,我使用$lookup在history array中填充了user个字段.但我得到了两个不同的回应.II如何将两个用户都推送到原始历史数组中?

用户在这里是一个字符串字段.

请帮帮忙.

推荐答案

也可以做with unwinding和分组,但缺点是,你需要在小组赛阶段使用一堆$first才不会丢失字段.因此,如果主文档中有很多字段,可能会出现一些重复

一种不放手的方法

  1. 将字符串history.user转换为OBJECTID
  2. 查找关联用户并将其输入到users字段
  3. $map通过历史记录数组,并 for each 用户搜索新添加的users字段,并从$filter中获取匹配的第一个元素
  4. 最后删除users字段
db.approval.aggregate([
  { $match: {} },
  {
    $addFields: {
      history: {
        $map: {
          input: "$history",
          in: { $mergeObjects: [ "$$this", { user: { $toObjectId: "$$this.user" } } ] }
        }
      }
    }
  },
  {
    $lookup: {
      from: "users",
      localField: "history.user",
      foreignField: "_id",
      as: "users"
    }
  },
  {
    $addFields: {
      history: {
        $map: {
          input: "$history",
          in: {
            $mergeObjects: [
              "$$this",
              {
                user: {
                  $first: {
                    $filter: {
                      input: "$users",
                      as: "i",
                      cond: { $eq: [ "$$i._id", "$$this.user" ] }
                    }
                  }
                }
              }
            ]
          }
        }
      }
    }
  },
  { $unset: "users" }
])

demo

Node.js相关问答推荐

在child_Process中持久运行SSH命令

赫斯基添加命令已弃用?

如何在MEVN堆栈中结合创建和更新表单流程?

用于SLACK命令返回json而不是文本的AWS lambda函数

函数声明中的异步在没有等待的函数中做什么?

mongodb首先自连接,然后根据某些条件与另一个表连接

当try 将 formData 转换为 express js 时,服务器无法识别 multipart/form-data

找不到模块bcryptjs

在 nodejs 中使用 multer 上传文件返回未定义的 req.file 和空的 req.body

访问 Mongoose 查询之外的变量

Node.js mongodb 驱动程序异步/等待查询

如何正确使用 package.json 中的关键字属性?

适用于 Windows 7 的 NodeJS

如何undo撤消 Object.defineProperty 调用?

如何使用 Node.js 将 base64 编码图像(字符串)直接上传到 Google Cloud Storage 存储桶?

Node.js 应用程序有周期性的缓慢和/或超时(不接受传入的请求)

Bootstrap 中的 Grunt 依赖冲突

我可以让 node --inspect 自动打开 Chrome

nodemon + express,监听端口=?

桌面应用程序仅支持 oauth_callback 值 'oob'/oauth/request_token