【问题标题】:MongoDB Aggregate with list dataMongoDB聚合与列表数据
【发布时间】:2018-07-11 10:38:26
【问题描述】:

我需要使用 mongodb 聚合将数据与一组字段分组。这是我在集合中的数据

[
    {
        bookName: "aaaa",
        bookNo: "1",
        registeredDate: "2018-02-01T06:51:16.738Z"
    },
    {
        bookName: "bbbb",
        bookNo: "2",
        registeredDate: "2018-02-01T06:51:29.244Z"
    }
    {
        bookName: "cccc",
        bookNo: "1",
        registeredDate: "2018-02-01T06:51:29.244Z"
    }
    {
        bookName: "dddd",
        bookNo: "2",
        registeredDate: "2018-02-01T06:51:29.244Z"
    }
]

我需要将上面的数据聚合成group by,并显示组内的数据。这是我需要的输出,

{
    Books: [
        {
        bookNo: "1",
            books: [{
                    bookName: "aaaa",
                    registeredDate: "2018-02-01T06:51:16.738Z"
                },
                {
                    bookName: "cccc",
                    registeredDate: ""2018-02-01T06:51:29.244Z"
                }]
        },
        {
        bookNo: "2",
            books: [{
                bookName: "bbbb",
                registeredDate: "2018-02-01T06:51:29.244Z"
            },
            {
                bookName: "dddd",
                registeredDate: "2018-02-01T06:51:29.244Z"
            }]
        }
    ]
}

有人帮我找到解决办法。

提前致谢,

【问题讨论】:

    标签: mongodb join mongodb-query aggregate


    【解决方案1】:

    尝试以下聚合:

    db.books.aggregate([
        {
            $group: {
                _id: "$bookNo",
                books: {
                    $push: {
                        bookName: "$bookName",
                        registeredDate: "$registeredDate"
                    }
                }
            }
        },
        {
            $project:{
                _id: 0,
                bookNo: "$_id",
                books: 1
            }
        }
    ])
    

    $group 中,您可以指定每个文档中哪些字段将是$pushed。然后您可以使用$project_id 重命名为bookNo 字段

    【讨论】:

    • 谢谢mickl,但顺序不同,它显示为books:[{..}], bookNo:2,我需要它以相反的顺序为bookNo:2, books:[{..}]。有什么需要改变的。
    • 嘿,老实说,您不应该依赖任何类似 JSON 的结构中的键顺序:stackoverflow.com/questions/5046835/…
    【解决方案2】:
    db.collection.aggregate(
    
        // Pipeline
        [
            // Stage 1
            {
                $group: {
                    _id: '$bookNo',
                    //Books:{$addToSet:{bookNo:'$bookNo'}},
                    books: {
                        $addToSet: {
                            bookname: '$bookName',
                            registeredDate: '$registeredDate'
                        }
                    },
    
                }
            },
    
            // Stage 2
            {
                $group: {
                    _id: null,
                    Books: {
                        $addToSet: {
                            books: '$books',
                            bookNo: '$_id'
                        }
                    }
                }
            },
    
            // Stage 3
            {
                $project: {
                    _id: 0,
                    Books: 1
                }
            }
    
        ]
    
    
    );
    

    【讨论】:

      猜你喜欢
      • 2016-07-02
      • 2017-02-18
      • 2014-05-27
      • 1970-01-01
      • 2017-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多