【问题标题】:Mongo DB aggregation to convert books to array of authorsMongodb聚合将书籍转换为作者数组
【发布时间】:2020-06-05 14:08:35
【问题描述】:

我的藏书是这样的:

{
    "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
}

此集合包含书名、作者和数量的书籍文档。

我需要帮助来进行聚合,该聚合将输出作者数组及其书籍和数量。示例 - Tom 创作了“Book1”和“Book2”,“Dick”创作了“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"
            }
        ]
    }
]

【问题讨论】:

    标签: mongodb mongodb-query aggregation-framework


    【解决方案1】:

    尝试如下:

    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
            }
        ]
    }
    

    【讨论】:

      【解决方案2】:

      试试这个聚合:

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

      我在 mongo 操场上试过: https://mongoplayground.net/p/m-QbX-uzkkt

      【讨论】:

        猜你喜欢
        • 2022-01-22
        • 2020-08-20
        • 1970-01-01
        • 1970-01-01
        • 2021-11-25
        • 2015-10-09
        • 2021-09-03
        • 2019-08-09
        • 2019-03-15
        相关资源
        最近更新 更多