使用聚合查询获取用户列表,其中包含总事务计数和事务详细信息作为嵌入文档



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

我有以下数据库架构:

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

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

交易:_id、日期、product_id(参考产品(、user_id(参考用户(、数量、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:                                                        
}
}
]

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

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

  • 查找阶段会将您的用户集合与事务集合联接(无需在预期结果中加入产品(。它的管道与$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]
}
}

},    
}
},
]
);

最新更新