Mon go Агрегация БД для преобразования книг в массив авторов - PullRequest
1 голос
/ 21 февраля 2020

Моя коллекция книг выглядит следующим образом:

{
    "book": {
        "title": "Book1",
        "author": "Tom"
    },
    "quantity": 3
},
{

    "book": {
        "title": "Book2",
        "author": "Tom"
    },
    "quantity": 4
},
{

    "book": {
        "title": "Book3",
        "author": "Dick"
    },
    "quantity": 9
},
{

    "book": {
        "title": "Book4",
        "author": "Harry"
    },
    "quantity": 6
},
{

    "book": {
        "title": "Book5",
        "author": "Chris"
    },
    "quantity": 7
},
{

    "book": {
        "title": "Book6",
        "author": "Dick"
    },
    "quantity": 10
}

В этой коллекции есть книжные документы с названием, автором и количеством.

Мне нужна помощь в создании агрегации, которая выдала бы массив авторов с их книгами и количеством. Пример - Том создал «Book1» и «Book2», «Дик» создал «Book6» и «Book3».

authors: [
    {
        "name": "Tom",
        "books": [
            {
                    "title": "Book1",
                    "quantity": "3"
            },
            {
                    "title": "Book2",
                    "quantity": "4"
            }
        ]
    },
    {
        "name": "Dick",
        "books": [
            {
                    "title": "Book6",
                    "quantity": "10"
            },
            {
                    "title": "Book3",
                    "quantity": "9"
            }
        ]
    },
    {
        "name": "Harry",
        "books": [
            {
                    "title": "Book4",
                    "quantity": "6"
            }
        ]
    }
]

Ответы [ 2 ]

1 голос
/ 21 февраля 2020

Попробуйте эту агрегацию:

db.collection.aggregate([{
$group: {
  _id: "$book.author",
  books: {
    $push: {
      title: "$book.title",
      quantity: "$quantity"
    }
  }
}},{
$project: {
  "name": "$_id",
  "books": 1,
  "_id": 0
}}])

Я пробовал на пн go Детская площадка: https://mongoplayground.net/p/m-QbX-uzkkt

1 голос
/ 21 февраля 2020

Попробуйте как показано ниже:

db.collection.aggregate([
    {
        $group: {
            _id: "$book.author",
            books: { $push: { "title": "$book.title", "quantity": "$quantity"} }
        },

    }
])

Вывод будет

/* 1 */
{
    "_id" : "Chris",
    "books" : [
        {
            "title" : "Book5",
            "quantity" : 7
        }
    ]
},

/* 2 */
{
    "_id" : "Harry",
    "books" : [
        {
            "title" : "Book4",
            "quantity" : 6
        }
    ]
},

/* 3 */
{
    "_id" : "Dick",
    "books" : [
        {
            "title" : "Book3",
            "quantity" : 9
        },
        {
            "title" : "Book6",
            "quantity" : 10
        }
    ]
},

/* 4 */
{
    "_id" : "Tom",
    "books" : [
        {
            "title" : "Book1",
            "quantity" : 3
        },
        {
            "title" : "Book2",
            "quantity" : 4
        }
    ]
}
...