$lookup inside $lookup 在数组中的对象数组中

Posted

技术标签:

【中文标题】$lookup inside $lookup 在数组中的对象数组中【英文标题】:$lookup inside $lookup in array of objects inside array 【发布时间】:2021-12-15 13:28:30 【问题描述】:

我是 mongoDB 的新手。也许这是一个简单的问题。请帮我解决这个问题。

要在填充值中填充的 mongo 查询是什么?

有 3 个表用户,bookHistory 和书籍。我需要在所有三个中查找。

这是我需要的结构。

"userList": [
  
    "_id": "NT-723DD65BE100-444B-B441-2B2804ED7348",
    "name": "AMC",
    "uid": "NT-723DD65BE100-444B-B441-2B2804ED7348",
    "bookHistory": [
      
        "_id": "SHNH-06E723698ED8-420F-AB6D-6574633F5984",
        "bookStocksId": "SHNC-4559F09A7F4B-4508-9F61-2A2CD248D3F9",
        "bookId": "SHN-E3AE0DB3BC7D-4214-BDAE-59140DA1F850",
        "uid": "NT-723DD65BE100-444B-B441-2B2804ED7348",
        "bookDetails": 
          "_id": "SHN-E3AE0DB3BC7D-4214-BDAE-59140DA1F850",
          "nameOfBook": "test",
          "nameOfAuthor": "test authou",
        
      ,
      
        "_id": "617e6c068bf26821f955b034",
        "bookStocksId": "SHNC-694DF63AE953-40A8-B49B-71E46D0A9463",
        "bookId": "SHN-5B5A2712CE88-46BF-8A5F-F01174316025",
        "uid": "NT-723DD65BE100-444B-B441-2B2804ED7348",
        "bookDetails": 
          "_id": "SHN-5B5A2712CE88-46BF-8A5F-F01174316025",
          "nameOfBook": "test",
          "nameOfAuthor": "test authou",
        
      
    ]
  
]
从“users”表需要使用 uid 填充“bookHistory”表 从 bookHistory 表需要使用 bookId 填充“books”表

有可能吗?我正在尝试这段代码

const pipeline = [
   $match: query ,
   $project: projection ,
  
    $lookup: 
      from: 'bookHistory',
      localField: 'uid',
      foreignField: 'uid',
      as: 'bookHistory',
    
  ,
];

以下是 3 个表格的示例数据

    用户表
 
  "_id" : "NT-723DD65BE100-444B-B441-2B2804ED7348", 
  "name" : "AMC", 
  "uid" : "NT-723DD65BE100-444B-B441-2B2804ED7348", 
  "updatedBy" : "NT-723DD65BE100-444B-B441-2B2804ED7348", 
  "updatedOn" : ISODate("2021-10-22T02:45:31.320+0000"), 

    书史
 
  "_id" : "SHNH-F10ED64A7F98-480B-8D8F-B7587594FB10", 
  "bookStocksId" : "SHNC-7D60FF3D3E15-4C43-AB24-7E3EA1C0D79A", 
  "bookId" : "SHN-E3AE0DB3BC7D-4214-BDAE-59140DA1F850", 
  "uid" : "NT-723DD65BE100-444B-B441-2B2804ED7348", 
  "tookOn" : ISODate("2021-10-31T12:59:24.895+0000"), 
  "dueOn" : ISODate("2021-11-07T12:59:24.895+0000"), 
  "addedOn" : ISODate("2021-10-31T12:59:24.895+0000")

    书桌
 
"_id" : "SHN-E3AE0DB3BC7D-4214-BDAE-59140DA1F850", 
"nameOfBook" : "test", 
"nameOfAuthor" : "test authou", 
"yearOfPublication" : "1998", 
"publication" : "test", 
"addedOn" : ISODate("2021-10-27T08:39:00.147+0000")

谁能帮我解决这个问题?

【问题讨论】:

如果您可以为您的 3 个表格提供示例数据,将会很有帮助 @ray 我已经添加了 3 个表的示例数据 【参考方案1】:

$lookupuserbookHistory的子管道中简单地执行另一个$lookupbookHistorybooks

db.user.aggregate([
  
    "$lookup": 
      "from": "bookHistory",
      let: 
        uid: "$uid"
      ,
      pipeline: [
        
          $match: 
            $expr: 
              $eq: [
                "$$uid",
                "$uid"
              ]
            
          
        ,
        
          "$lookup": 
            "from": "books",
            "localField": "bookId",
            "foreignField": "_id",
            "as": "bookDetails"
          
        ,
        
          "$unwind": "$bookDetails"
        
      ],
      "as": "bookHistory"
    
  
])

这是Mongo playground 供您参考。

【讨论】:

以上是关于$lookup inside $lookup 在数组中的对象数组中的主要内容,如果未能解决你的问题,请参考以下文章

Excel中lookup的用法解惑

无法使字段静态最终 java.lang.invoke.MethodHandles$Lookup java.lang.invoke.MethodHandles$Lookup.IMPL_LOOKUP

逆向查询:LOOKUP函数

EXCEL中MATCH函数lookup_array的排序问题

Ansible自动化运维Ansible变量之lookup生成变量方法

datastage lookup报错,求解