簡體   English   中英

MongoDB 按 id 對文檔進行分組並從文檔中合並匹配的數組元素

[英]MongoDB group documents by id and merge matching array elements from the documents

我正在嘗試使用 Mongo 聚合框架按 id 對文檔進行分組,然后將每個文檔中的“事件”數組合並到一個數組中。 我嘗試過不同的組累加器; push, first, last 等。通過 push 會產生一個 arrays 數組。 但我想要一個包含所有事件對象的數組。 MongoDB 4.4

文件

{
        _id: 123,
        name: "John",
        events: [
            {
                start: "2020-01-01",
                end: "2020-01-01"
            },
            {
                start: "2020-01-01",
                end: "2020-01-01"
            }
        ]
    },
    {
        _id: 123,
        name: "John",
        events: [
            {
                start: "2020-01-21",
                end: "2020-01-21"
            },
        ]
    },
        {
            _id: 456,
            name: "Ben",
            events: [
                {
                    start: "2020-01-21",
                    end: "2020-01-21"
                },
            ]
        },
        {
            _id: 456,
            name: "Ben",
            events: [
                {
                    start: "2020-02-01",
                    end: "2020-02-01"
                },
            ]
        },

我的群組匯總

'$group': {
        '_id': '$_id',
        'resourceName': {
            '$first': '$name',
        },
        'events': {
            '$push': "$events"
        }
    }

所需 output

[
    {
        _id: 123,
        name: "John",
        events: [
            {
                start: "2020-01-01",
                end: "2020-01-01"
            },
            {
                start: "2020-01-01",
                end: "2020-01-01"
            },
            {
                start: "2020-01-21",
                end: "2020-01-21"
            },
        ]
    },
        {
            _id: 456,
            name: "Ben",
            events: [
                {
                    start: "2020-02-01",
                    end: "2020-02-01"
                },
                {
                    start: "2020-01-21",
                    end: "2020-01-21"
                },
            ]
        },
    ]

使用 $unwind 將源 arrays 展平,然后使用 $addToSet 刪除重復項。

數據:

cc.insert_many([{
  foo: 1,
  bar: [10, 11],
}, {
  foo: 1,
  bar: [10, 21],
}, {
  foo: 2,
  bar: [30, 31],
}])
[{"$unwind"=>"$bar"},
 {"$group"=>{"_id"=>"$foo", "bar"=>{"$addToSet"=>"$bar"}}}]

[{"_id"=>2, "bar"=>[30, 31]}, {"_id"=>1, "bar"=>[21, 10, 11]}]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM