MongoDB嵌套分组
我有以下MongoDB数据模型: { _id:Objectd53725814740FD6D2EE0CA2BB, 日期:2014-01-01, 机构编号:1,, 产品:[ { 产品编号:1, 价格:7.03, 其他信息:325, 某物:6878 }, { 产品编号:2, 价格:4.6, 其他信息:243, 某物:1757 }, { 产品编号:3, 价格:2.14,, 其他信息:610, 某物:5435 }, { 产品编号:4, 价格:1.45,, 其他信息:627, 某物:5762 }, { 产品编号:5,, 价格:3.9, 其他信息:989, 某物:3752 } } 获取所有机构的平均价格的最快方法是什么?是否有更好的数据模型来实现这一点?一个运营商应该很好地处理这个问题。我建议调查一下运营商 以下内容应作为一个示例:MongoDB嵌套分组,mongodb,aggregation-framework,Mongodb,Aggregation Framework,我有以下MongoDB数据模型: { _id:Objectd53725814740FD6D2EE0CA2BB, 日期:2014-01-01, 机构编号:1,, 产品:[ { 产品编号:1, 价格:7.03, 其他信息:325, 某物:6878 }, { 产品编号:2, 价格:4.6, 其他信息:243, 某物:1757 }, { 产品编号:3, 价格:2.14,, 其他信息:610, 某物:5435 }, { 产品编号:4, 价格:1.45,, 其他信息:627, 某物:5762 }, { 产品
db.collection.aggregate(
{$match: {<query parameters>}},
{$unwind: "$products"},
{
$group: {
_id: "<blank or field(s) to group by before averaging>",
$avg: "$price"
}
}
);
以这种风格构建的聚合应该生成一个JSON对象,该对象包含您想要的数据。由于其他任何内容中存在严重语法错误,更直接的答案是: db.collection.aggregate[ {$unwind:$products}, {$group:{ _id:null, avgprice:{$avg:$products.price} }} ] 此处的用法是首先使用数组,这是将数组中的内容反规范化为单独文档的一种方法 然后在阶段中,您将null值传递给_id,这意味着将所有内容分组并传递$products。请注意,将点符号传递给运算符,以返回集合中所有文档中所有子文档条目的总平均值
有关更多信息,请参阅。我找到的最佳解决方案是:
db.collection.aggregate([
{$match:{date:{$gte:"2014-01-01",$lte:"2014-01-31"},establishmentId:{$in:[1,2,3,4,5,6]}}
{ "$unwind": "$products" },
{ "$group": {
"_id": {date:"$date",product:"$products.productId"},
"avgprice": { "$avg": "$products.price" }
}}
])
我还发现,最好先使用match,然后再使用unwind,这样可以减少要展开的项目。这会加快整个过程。我想你指的是每个产品的平均价格?而不是所有产品的平均价格?无论哪种方式,答案都是使用聚合框架,在products array上使用$unwind,在products array上使用$gro使用$avg运算符向上计算平均值。