Как сгруппировать записи на основе элементов массива, используя MongoDB - PullRequest
1 голос
/ 07 мая 2019

У меня есть сбор данных, который содержит набор записей в следующем формате.

{
    "_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 Ответ

3 голосов
/ 07 мая 2019

Сначала вы должны использовать $ unwind , который выводит один документ для каждого элемента в массиве.

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