【问题标题】:Unable to aggregate subdocument's array无法聚合子文档的数组
【发布时间】:2015-02-03 07:39:01
【问题描述】:

我有如下文件

需要聚合最新评级最后一个数组元素并平均(3,1,3,1)它, 在这里我卡住了双重展开无法得到结果

{  
Name: name  
Content: [
      {   Rating:[1,2,3]  }    ,   
      {   Rating:[3,2,1]  }
]
},
{  
Name: name  
Content: [
      {   Rating:[1,2,3]  }    ,   
      {   Rating:[3,2,1]  }
]
}

【问题讨论】:

  • 您为最新评级元素设置了哪些标准?
  • 请改进您的问题,以说明需要计算平均值的方式以及在哪个rating 元素上。
  • 我只需要 rating 的每个最后一个数组元素的平均结果

标签: javascript node.js mongodb mongoose aggregation-framework


【解决方案1】:

根据您的问题,我知道您应该找出最后评分的平均值,因此在您的情况下,Rating:[3,2,1] 将是您想要平均的最后评分,但问题是您的评分数据按照这两个线程 click here 排列在数组中和click here 你应该改变评级结构如下

 Rating:[{"first":1,"second":2,"third":3}]

所以使用它很容易找出平均值,但是,如果你不能改变这个结构,那么你应该放松两次,如果你的集合大小有限,它会出现笛卡尔问题,它会有所帮助,但对于大集合大小它需要。我使用了聚合并展开了两次,得到了下面最后一个评分代码的平均值。

db.collectionName.aggregate(
 {"$unwind":"$Content"},// first unwind on content
 {"$group":{"_id":"$_id","Ratings":{"$last":"$Content.Rating"}}},   
 {"$unwind":"$Ratings"},// Second for remove array element to outside
 {"$group":{"_id":"$_id","avg":{"$avg":"$Ratings"}}})

【讨论】:

  • 感谢 Yogesh 的快速回复。解决方案似乎不错。但是我担心如果父文档变大(在几千范围内),服务器会占用太多资源。
猜你喜欢
  • 1970-01-01
  • 2019-05-20
  • 1970-01-01
  • 2013-04-03
  • 1970-01-01
  • 1970-01-01
  • 2020-10-16
  • 2015-04-01
  • 1970-01-01
相关资源
最近更新 更多