MongoDb:聚合 $lookup

Posted

技术标签:

【中文标题】MongoDb:聚合 $lookup【英文标题】:MongoDb: aggregation $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:
    

    

【问题讨论】:

我已经撤消了似乎意外删除您问题的大部分信息的操作。 【参考方案1】:
    $lookup - 使用管道连接 useruser_credential_id 以匹配条件 ($match) 并装饰文档 ($project)。 $unwind - 将 member 数组解构为多个文档。 $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中使用聚合方法所以这就是为什么,你能帮帮我吗? 模式中的猫鼬

以上是关于MongoDb:聚合 $lookup的主要内容,如果未能解决你的问题,请参考以下文章

mongodb Aggregation聚合操作之$facet

Mongodb中数据聚合之聚合管道aggregate

mongodb3 之单一用途聚合

MongoDB 聚合

翻译MongoDB指南/聚合——聚合管道

mongodb Aggregation聚合操作之$bucket