Database MongoDB使用$project按键从数组元素中获取
我收集了以下文件Database MongoDB使用$project按键从数组元素中获取,database,mongodb,Database,Mongodb,我收集了以下文件 { _id:"1", address: "My office", email:"xxx@yyy.com", trxs:[ { type: 'sale', amount: 800 }, { type: 'buy', amount: 300 } ] }, { _id:"2", ad
{
_id:"1",
address: "My office",
email:"xxx@yyy.com",
trxs:[
{
type: 'sale',
amount: 800
},
{
type: 'buy',
amount: 300
}
]
},
{
_id:"2",
address: "My house",
email:"zzz@www.com",
trxs:[
{
type: 'buy',
amount: 200
},
{
type: 'sale',
amount: 400
}
]
},
我想使用$project
获取以下文档:
{
email:"xxx@yyy.com",
sale: 800,
buy: 300
},
{
email: "zzz@www.com",
buy: 200,
sale: 400
}
我不能使用$arrayElementAt
,因为数组是随机的,销售可以位于位置0或1。您可以展开“trxs”字段,然后使用$group和$cond将销售对象的值添加到销售字段,并将购买对象添加到购买字段
以下聚合可以解决您的问题:
db.test.aggregate([
{ $unwind: "$trxs" },
{
$group: {
_id: "$_id",
email: { $last: "$email" },
sale: {
$sum: { $cond: [{ $eq: ["$trxs.type", "sale"] }, "$trxs.amount", 0] },
},
buy: {
$sum: { $cond: [{ $eq: ["$trxs.type", "buy"] }, "$trxs.amount", 0] },
},
},
},
{ $project: { _id: 0 } },
]);
$unwind方法可以工作,但性能方面的速度非常慢。实际上,通过代码实现行为的速度更快,但我认为这不是一种正确的方法,因为DB必须更好地完成所有工作。有什么办法可以改进吗?