如何使用 MongoDB 根据数组元素对记录进行分组

Posted

技术标签:

【中文标题】如何使用 MongoDB 根据数组元素对记录进行分组【英文标题】:How to group records based on array elements using MongoDB 【发布时间】:2019-09-25 10:23:54 【问题描述】:

我有一个数据集合,其中包含以下格式的一组记录。


    "_id" : 22,
    "title" : "3D User Interfaces with Java 3D",
    "isbn" : "1884777902",
    "pageCount" : 520,
    "publishedDate" : ISODate("2000-08-01T07:00:00Z"),
    "thumbnailUrl" : "https://s3.amazonaws.com/AKIAJC5RLADLUMVRPFDQ.book-thumb-images/barrilleaux.jpg",
    "longDescription" : "Description",
    "status" : "PUBLISH",
    "authors" : [
        "Jon Barrilleaux"
    ],
    "categories" : [
        "Java",
        "Computer Graphics"
    ]
,

    "_id" : 23,
    "title" : "Specification by Example",
    "isbn" : "1617290084",
    "pageCount" : 0,
    "publishedDate" : ISODate("2011-06-03T07:00:00Z"),
    "thumbnailUrl" : "https://s3.amazonaws.com/AKIAJC5RLADLUMVRPFDQ.book-thumb-images/adzic.jpg",
    "status" : "PUBLISH",
    "authors" : [
        "Gojko Adzic"
    ],
    "categories" : [
        "Software Engineering"
    ]

请注意,“类别”是一个数组。

我想统计每个类别的已出版书籍。我尝试了以下解决方案,但它将整个数组视为一组。

db.books.aggregate([
    
        $group:_id:"$categories", total:$sum:1
    
])

而不是这样,我想计算“类别”数组中每个单独类别值的记录数。

【问题讨论】:

【参考方案1】:

您应该首先使用$unwind,它为数组中的每个元素输出一个文档。

db.books.aggregate([
   
    $unwind : "$categories"
  ,
  
    $group :  _id : "$categories", total:  $sum: 1  
     
])

【讨论】:

以上是关于如何使用 MongoDB 根据数组元素对记录进行分组的主要内容,如果未能解决你的问题,请参考以下文章

使用 MongoDB .Net 驱动程序对存储在文档字段中的数组进行分页

如何在mongodb中以字母数字形式对1000000个元素数组进行排序

如何在 MongoDB 中对集合记录中的数组进行排序?

如何根据另一个字段更新 mongodb 中的数组 dict 元素

MongoDB,按两个数组之间匹配元素的数量对结果进行排序

如何对 mongoose/mongodb 和 nodejs 中的对象数组进行排序?