从How to average the summed up values in mongodb?
扩展使用MongoDB 2.4.8,
我有以下记录
{
"category" : "TOYS",
"price" : 12,
"status" : "online",
"_id" : "35043"
}
{
"category" : "TOYS",
"price" : 13,
"status" : "offline",
"_id" : "35044"
}
{
"category" : "TOYS",
"price" : 22,
"status" : "online",
"_id" : "35045"
}
{
"category" : "BOOKS",
"price" : 13,
"status" : "offline",
"_id" : "35046"
}
{
"category" : "BOOKS",
"price" : 17,
"status" : "online",
"_id" : "35047"
}
{
"category" : "TOYS",
"price" : 19,
"status" : "unavailable",
"_id" : "35048"
}
{
"category" : "BOOKS",
"price" : 10,
"status" : "unavailable",
"_id" : "35049"
}
{
"category" : "BOOKS",
"price" : 17,
"status" : "unavailable",
"_id" : "35050"
}
我想查找状态为在线或离线的所有类别的平均价格,并且某个类别的总价格超过50个。
离线玩具和玩具在线被视为两个独立的类别。
我改编了答案。
db.items.aggregate([
{$match:
{
$or: [
{status:"online"},
{status:"offline"}
]
}
},
{$group :
{
_id: "$category",
total_price: {$sum:"$price"},
}
},
{$match:
{
total_price:{$gt:50}
}
},
{$group :
{
_id: "1",
avg_price: {$avg:"$total_price"},
}
},
]);
但我相信这个问题我将相同名称的分类组合在一起,这不是我想要的。
答案 0 :(得分:2)
如果在线和离线是[{1}}的唯一值,您可以删除最初的status
步骤。如果需要,使用$in
operator更合适,因为这些值可以在同一个索引中找到(如果存在)。
我认为您唯一缺少的一步是您可以$match
多个字段(即类别和状态):
$group