Database 获取集合mongodb中所有文档中多个元素的频率

Database 获取集合mongodb中所有文档中多个元素的频率,database,mongodb,mongodb-query,aggregation-framework,aggregate,Database,Mongodb,Mongodb Query,Aggregation Framework,Aggregate,这就是我的问题 我是mongodb的新手,有一个文档集,文档保存方式如下: { "_id": { "$oid": "60626db173b4ca321c02ee3e" }, "year": "2021", "name": "Book 1", "authors": ["Joe, B", "Je

这就是我的问题

我是mongodb的新手,有一个文档集,文档保存方式如下:

{
 "_id": {
    "$oid": "60626db173b4ca321c02ee3e"
 },
 "year": "2021",
 "name": "Book 1",
 "authors": ["Joe, B", "Jessica, K"],
 "createdAt": {
     "$date": "2021-03-30T00:15:45.859Z"
 }
},
{
 "_id": {
    "$oid": "60626db173b4ca321c02ee4e"
 },
 "year": "2021",
 "authors": ["Carl, B", "Jessica, K"],
 "name": "Book 2"
 "createdAt": {
     "$date": "2021-03-30T00:15:45.859Z"
 }
},
我需要得到所有作者的频率和书的年代

预期结果如下(只要我能得到每个元素的频率,结果如何返回并不重要):

我见过这个线程,它在一个数组中完成这项工作,但我不知道是否有可能同时获得多个元素(年份、作者)的频率,或者如何做到这一点

谢谢你的帮助。谢谢。演示-

按年份将作者放入数组中,将年度发生数放入个人文档中

按作者排序并获取作者出现的次数

按null组合所有文档,使用推送唯一值并转换以获得最终输出


演示2-对于按年份分组的作者计数-

@jay2p取决于您拥有的数据集有多大,如果您的数据较小,则DB查询更好,但如果您拥有一个较大的数据集,则应使用DB和其馀代码进行一些计算。这很好,演示1就是我一直在寻找的!现在我只需要将它调整到10个字段:)!但是出于好奇和性能方面的考虑,假设我必须得到的频率不是两年(在本例中是年和作者),而是10种不同的事情(年、作者、出版商等等),最好一个接一个地做或者做一个大的查询?你知道哪个更快吗?谢谢你的回复。我明白了。有道理。再次感谢您。@jay2p很高兴它有帮助:)
{
  "authors": {
     "Joe, B": 1,
     "Carl, B": 1,
     "Jessica, K": 2
  },
  "year": {
     "2021": 2
  }
}
db.collection.aggregate([
  {
    $group: {
      _id: { year: "$year" },
      authors: { $push: "$authors" },
      yearCount: { $sum: 1 }
    }
  },
  { $unwind: "$authors" },
  { $unwind: "$authors"},
  {
    $group: {
      _id: { author: "$authors" },
      year: { $first: "$_id.year" },
      yearCount: { $first: "$yearCount" },
      authors: { $push: "$authors" },
      authorCount: { $sum: 1 }
    }
  },
  {
    "$group": {
      _id: null,
      years: {
        $addToSet: { k: "$year", v: "$yearCount" }
      },
      authors: {
        $addToSet: { k: "$_id.author", v: "$authorCount" }
      }
    }
  },
  {
    $project: {
      _id: 0,
      years: { $arrayToObject: "$years" },
      authors: { $arrayToObject: "$authors" }
    }
  }
])