【问题标题】:MongoDb: aggregation $lookupMongoDb:聚合 $lookup
【发布时间】:2022-01-05 15:59:14
【问题描述】:

鉴于以下集合。 我必须得到标题字段并结合到标识符

凭据:

{
    _id: ..
    title: ..
}

USER_CREDENTIAL:

{
    _id: ..
    credential_id: .. (from credential collection)
    created_at: ..
    identifier: {
        first_name: ..
        middle_name: ..
        last_name: ..
    }
}

响应应该是:

{
   user_credential_id: 
   member: {
        first_name:
        middle_name:
        last_name:
        title:
        created_at:
    }
}
    

【问题讨论】:

  • 我已经撤消了似乎意外删除您问题的大部分信息的操作。

标签: mongodb filter lookup aggregation


【解决方案1】:
  1. $lookup - 使用管道连接 useruser_credential_id 以匹配条件 ($match) 并装饰文档 ($project)。
  2. $unwind - 将 member 数组解构为多个文档。
  3. $project - 装饰输出文档。
db.user.aggregate([
  {
    "$lookup": {
      "from": "user_credential",
      let: {
        "user_credential_id": "$_id",
        "title": "$title"
      },
      pipeline: [
        {
          $match: {
            $expr: {
              $eq: [
                "$credential_id",
                "$$user_credential_id"
              ]
            }
          }
        },
        {
          $project: {
            first_name: "$identifier.first_name",
            middle_name: "$identifier.middle_name",
            last_name: "$identifier.last_name",
            title: "$$title",
            created_at: "$created_at",
            
          }
        }
      ],
      "as": "member"
    }
  },
  {
    $unwind: "$member"
  },
  {
    $project: {
      _id: 0,
      user_credential_id: "$_id",
      member: 1
    }
  }
])

Sample Mongo Playground

【讨论】:

  • 结果为空数组
  • $match 是什么?
  • 能否提供样本文件证明? $match 运算符用于过滤符合过滤条件的文档。
  • 我想在nodejs中使用聚合方法所以这就是为什么,你能帮帮我吗?
【解决方案2】:

你可以试试这个查询

db.user.aggregate([
  {
    $lookup: {
      from: "credentials",
      localField: "credential_id",
      foreignField: "_id",
      as: "user_credential"
    }
  },
  {
    $unwind: "$user_credential"
  },
  {
    $project: {
      _id: 0,
      user_credential_id: "$credential_id",
      member: {
        first_name: "$identifier.first_name",
        middle_name: "$identifier.middle_name",
        last_name: "$identifier.last_name",
        title: "$user_credential.title",
        created_at: "$created_at",
        
      }
    }
  }
])

您可以查看here

【讨论】:

  • 结果为空数组
  • $match 是什么?
  • 根据您的问题,您没有指定您希望查询匹配某个值,您想要的只是集成标题字段并将其组合到基于 user_credential 的每个文档的标识符。这是第一,第二你说你得到一个空数组,这很奇怪,你试过我在帖子中留下的链接吗? mongoplayground.net/p/oJIzHWnOs-w
  • 我想在nodejs中使用聚合方法所以这就是为什么,你能帮帮我吗?
  • 模式中的猫鼬
猜你喜欢
  • 1970-01-01
  • 2019-03-23
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
  • 2019-09-03
  • 2017-10-08
  • 1970-01-01
  • 2021-02-22
相关资源
最近更新 更多