MongoDB嵌套分组

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 }, { 产品

我有以下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 } } 获取所有机构的平均价格的最快方法是什么?是否有更好的数据模型来实现这一点?

一个运营商应该很好地处理这个问题。我建议调查一下运营商

以下内容应作为一个示例:

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运算符向上计算平均值。