MongoDB:分组和计数元素

时间:2020-11-12 22:07:59

标签: mongodb mongodb-query aggregation-framework

我有一本书的清单。我想获得作者撰写的体裁数目,也想在结果中加上这些体裁。我的数据库如下:

{"_id": ObjectID("1), "title": "Harry Potter", "year": NumberInt(2000), "author": "JK. Rowling", 
"genres": "Fantasy"}, 
"_id": ObjectID("2"), "title": "Harry Potter 99", "year": NumberInt(2020), "author": "JK. Rowling", 
"genres": "Drama"}, "_id": ObjectID("2"), "title": "Harry Potter", "year": NumberInt(2000), "author": "JK. Rowling", 
"genres": "Drama"}, {...}

所以,到目前为止,我的代码如下:

phase1 = {$group : {"_id" : "$author"}, "countgenres" : {$sum : 1}}
phase2 = {$addFields : "genres"}}
phase3 = {$sort : {"numgenres" : -1}}

steps = [phase1, phase2, phase3]
db.database.aggregate(steps)

这对我不起作用,所以我想请问有人可以帮助我编写正确的代码来做到这一点。结果应如下所示:

{

"_id" : "JK. Rowling",

"countgenres" : 4,

"genres" : [
"Fantasy",
"Drama"

]
}

一个小时前,我也发布了类似的问题,但是我在数据库中犯了一个错误,感谢您的宝贵时间。

1 个答案:

答案 0 :(得分:1)

尝试在this查询中添加了新作者以检查排序。

db.collection.aggregate([
  {
    "$match": {
      "author": "JK. Rowling"
    }
  },
  {
    "$unwind": "$genres"
  },
  {
    "$group": {
      "_id": "$author",
      "genres": {
        "$addToSet": "$genres"
      }
    }
  },
  {
    "$project": {
      "numgenres": {
        "$size": "$genres"
      },
      "genres": 1
    }
  },
  {
    "$sort": {
      "numgenres": -1
    }
  }
])

查询首先进行$unwind,以将值与genres分开,并使用$addToSet来避免重复值。然后使用$project获取数组大小。