使用聚合查询获取具有总交易计数和交易详细信息的用户列表作为嵌入文档

Posted

技术标签:

【中文标题】使用聚合查询获取具有总交易计数和交易详细信息的用户列表作为嵌入文档【英文标题】:Using aggregation query to get list of users with total transaction count and transaction detail as embedded document 【发布时间】:2019-03-08 14:10:18 【问题描述】:

我正在尝试获取具有总交易计数的用户列表,并且每个用户都应该使用 MongoDB 的聚合管道在 GET API 中获取结果作为嵌入对象的最新交易详细信息。

我有以下数据库架构:

用户:_id、姓名、电话、地址

产品:_id、名称、unit_price、描述

交易:_id, date, product_id(ref to Product), user_id(ref to User), quantity, total_price


预期响应 JSON

[
    
        name:"",
        phone:"",
        address:"",
        total_transaction:
        latest_transaction_detail: 
            product_id:
            quantity:
            total_price:                                                        
        
    ,
    
        name:"",
        phone:"",
        address:"",
        total_transaction:
        latest_transaction_detail: 
            product_id:
            quantity:
            total_price:                                                        
        
    
]

如何生成聚合查询以返回上述内容?

【问题讨论】:

【参考方案1】:

您可以通过运行聚合查询来实现此目的。

查找阶段会将您的 User 集合与您的 Transaction 集合一起加入(无需在预期结果中加入 Product)。它的管道被 $facet 分割,用于获取该用户的计数结果和最新交易

项目阶段将重塑您的数据并将数组元素提取到文档中。

这是一个这样的查询:

db.User.aggregate(
[
    
        $lookup: 
         
            from: "Transaction",
           let:  userId: "$_id" ,
            pipeline: [ 
            $facet:
              count:[$match:$expr:$eq:["$$userId","$user_id"], $count:"total_transaction"],
                latest:[
                $match:$expr:$eq:["$$userId","$user_id"],
                $sort:date:-1,
                $limit:1]
             ],
            as: "transactions"
         
    ,
    
        $project: 
          last_name:1,
          phone:1,
          address:1,
            total_transaction : 
              $let:
                vars:
                  count:
                    $arrayElemAt:["$transactions.count",0]
                    
                  ,
                in:
                  $arrayElemAt:["$$count.total_transaction",0]
                  
                
              ,
              latest_transaction : 
              $let:
                vars:
                  latest:
                    $arrayElemAt:["$transactions.latest",0]
                    
                  ,
                in:
                  $arrayElemAt:["$$latest",0]
                  
                


              ,    
            
        ,
    ]
);

【讨论】:

非常感谢您,它的工作!你们真的做得很好!继续摇摆。

以上是关于使用聚合查询获取具有总交易计数和交易详细信息的用户列表作为嵌入文档的主要内容,如果未能解决你的问题,请参考以下文章

交易后获取客户详细信息

获取具有不同类型和名称的特定ID mysql的总和

Paypal - PayFlow Pro,使用“交易 ID”获取交易详细信息 [关闭]

如何从贝宝捐赠中获取交易信息?

如何根据日期范围在 Stripe 中获取费用(交易)详细信息

有啥方法可以在 php 的返回页面中从 PayPal 获取交易详细信息?