为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用 MongoDB 的 Java 驱动程序将多个文档合并为一个文档?

如何使用 MongoDB 的 Java 驱动程序将多个文档合并为一个文档?

斯蒂芬大帝 2023-08-16 16:11:51
我正在处理包含音乐播放列表的文档。每个文档都有这样的结构:{    "user_id": "5858",    "playlists": [        {            "name": "My Playlist",            "guild_ids": ["7575"],            "items": [                {                     "title": "title",                     "url": "url",                     "duration": 200000                }             ]        }    ]}我想提取同一公会的所有播放列表。但问题是我希望结果在单个文档中返回。包含播放列表列表的一个文档。guild_id=5656 的预期结果如下:{    "playlists": [        {            "name": "My Playlist",            "guild_ids": ["5656"],            "items": [                {                     "title": "title",                     "url": "url",                     "duration": 200000                }             ]        },        // other playlists where guild_ids contains "5656"    ]}我尝试使用聚合,但我总是得到与唯一 user_ids 数量相同的文档数量。我得到按 user_id 分组的播放列表。
查看完整描述

1 回答

?
Smart猫小萌

TA贡献1911条经验 获得超7个赞

以下查询可以获得预期的输出:


db.collection.aggregate([

    {

        $unwind:"$playlists"

    },

    {

        $match:{

            "playlists.guild_ids":{

                $in:["7575"]

            }

        }

    },

    {

        $group:{

            "_id":null,

            "playlists":{

               $push: "$playlists"

            }

        }

    },

    {

        $project:{

            "_id":0

        }

    }

]).pretty()

数据集:


{

  "_id" : ObjectId("5d88225e38db7cf8d3f75cd6"),

  "user_id" : "5858",

  "playlists" : [

    {

      "name" : "My Playlist",

      "guild_ids" : [

        "7575"

      ],

      "items" : [

        {

          "title" : "title",

          "url" : "url",

          "duration" : 200000

        }

      ]

    }

  ]

}

{

  "_id" : ObjectId("5d88225e38db7cf8d3f75cd7"),

  "user_id" : "5858",

  "playlists" : [

    {

      "name" : "My Playlist 2",

      "guild_ids" : [

        "1234"

      ],

      "items" : [

        {

          "title" : "title",

          "url" : "url",

          "duration" : 200000

        }

      ]

    }

  ]

}

{

  "_id" : ObjectId("5d88225e38db7cf8d3f75cd8"),

  "user_id" : "5858",

  "playlists" : [

    {

      "name" : "My Playlist 3",

      "guild_ids" : [

        "7575"

      ],

      "items" : [

        {

          "title" : "title",

          "url" : "url",

          "duration" : 200000

        }

      ]

    }

  ]

}

输出:


{

    "playlists" : [

        {

            "name" : "My Playlist",

            "guild_ids" : [

                "7575"

            ],

            "items" : [

                {

                    "title" : "title",

                    "url" : "url",

                    "duration" : 200000

                }

            ]

        },

        {

            "name" : "My Playlist 3",

            "guild_ids" : [

                "7575"

            ],

            "items" : [

                {

                    "title" : "title",

                    "url" : "url",

                    "duration" : 200000

                }

            ]

        }

    ]

}

查询分析:我们正在展开playlists,仅过滤具有7575公会ID的那些,然后将它们重新分组。


查看完整回答
反对 回复 2023-08-16
  • 1 回答
  • 0 关注
  • 100 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信