MongoDB 多个子查询

Posted

技术标签:

【中文标题】MongoDB 多个子查询【英文标题】:MongoDB multiple subqueries 【发布时间】:2020-12-15 11:02:15 【问题描述】:

我对 no-sql 数据库有点陌生,所以我在这里有一个关于子查询的问题。

让我们想象一下下面的结构:

Type (_id, offerId)
Offer (_id, typeId, productId)
Product (_id, subId)

我需要通过 subId 找到所有类型。

我不知道它在 MongoDB 中是如何工作的,在 SQL 中我会做类似的事情:

select * from Type where offerId in 
  (select _id from Offer where productId in
    (select _id from Product where subId = 'test'));

对于 MongoDB,我尝试创建某种聚合查询,但它不起作用:


  "aggregate": "Type",
  "pipeline": [
    
      "$lookup": 
        "from": "Offer",
        "localField": "_id",
        "foreignField": "typeId",
        "as": "subOffer"
      
    ,
    
      "$lookup": 
        "from": "Product",
        "localField": "_id",
        "foreignField": "subOffer.productId",
        "as": "subProduct"
      
    ,
    
      "$match": 
        "subProduct.subId": "test"
      
    ,
    
      "$unwind": "$subProduct"
    ,
    
      "$unwind": "$subOffer"
    
  ]

这里有什么建议吗?

【问题讨论】:

【参考方案1】:

你可以试试,

$lookup on offer 使用管道收集 $match 类型 ID $lookup on product 使用管道收集 $match 字段 subIdproductId $match 产品不是 [] 为空 $match 报价不是[] 为空 $project删除报价字段
db.type.aggregate([
  
    $lookup: 
      from: "offer",
      let:  tid: "$_id" ,
      as: "offer",
      pipeline: [
         $match:  $expr:  $eq: ["$$tid", "$typeId"]   ,
        
          $lookup: 
            from: "product",
            as: "product",
            let:  pid: "$productId" ,
            pipeline: [
              
                $match: 
                  $and: [
                     subId: "test" ,
                     $expr:  $eq: ["$_id", "$$pid"]  
                  ]
                
              
            ]
          
        ,
         $match:  product:  $ne: []   
      ]
    
  ,
   $match:  offer:  $ne: []   ,
   $project:  offer: 0  
])

Playground

【讨论】:

以上是关于MongoDB 多个子查询的主要内容,如果未能解决你的问题,请参考以下文章

多个子字段的 MongoDB 查询匹配

MongoDB - 对时间序列子文档进行范围查询

mongodb 查询子节点

sql子查询到mongodb

mongoDB中的子查询问题

如何查询所有子文档