我正在尝试获取具有总事务计数的用户列表,并且每个用户都应该使用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]
}
}
},
}
},
]
);