使用列表数据进行MongoDB聚合

使用列表数据进行MongoDB聚合,mongodb,join,mongodb-query,aggregate,Mongodb,Join,Mongodb Query,Aggregate,我需要使用mongodb聚合将数据与字段集分组。这是我收集的数据 [ { bookName: "aaaa", bookNo: "1", registeredDate: "2018-02-01T06:51:16.738Z" }, { bookName: "bbbb", bookNo: "2", registeredDate: "2018-02-01T06:51:29.244Z"

我需要使用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"
            }]
        }
    ]
}
有人帮我找到解决办法


提前感谢,

尝试以下聚合:

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

$group
中,您可以指定将从每个文档中
$push
哪些字段。然后您可以使用
$project
\u id
重命名为
bookNo
字段

谢谢mickl,但顺序不同,它显示像
books:[{..}],bookNo:2
,我需要它的相反顺序是
bookNo:2,books:[{..}]
。任何东西都需要更改。嘿,老实说,在任何类似JSON的结构中,您不应该依赖于键的顺序:
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
            }
        }

    ]


);