MongoDB聚合和投影问题

时间:2016-04-17 20:48:07

标签: mongodb nosql

StackOverflow的帮助人员!

我正在学习如何使用MongoDB,目前我遇到了一个特定问题。

我正在建立一个吉他标签应用程序,只与一个"艺术家"基础文件。所有其他数据都是子文档。根据访问的功能(例如:搜索,按艺术家列出标签,查看单个标签),我会相应地汇总和投影我的文档。

但是,我无法按需要投放一个投影。

鉴于以下数据:

{
    "artist" : "Jeff Buckley",
    "songs" : [
        {
            "name" : "Grace",
            "tabs" : [
                {
                    "version" : 1,
                    "tab" : "...",
                    "tuning" : "DADGBe"
                },
                {
                    "version" : 2,
                    "tab" : "...",
                    "tuning" : "DADGBe"
                }
            ]
        },
        {
            "name" : "Last Goodbye",
            "tabs" : [
                {
                    "version" : 1,
                    "tab" : "...",
                    "tuning" : "DGDGBD"
                },
                {
                    "version" : 2,
                    "tab" : "...",
                    "tuning" : "EADGBe"
                }
            ]
        }
    ]
}

我想以下列方式聚合列表视图:

{
    "artist" : "Jeff Buckley",
    "tabs" : [
        {
            "song" : "Grace",
            "version" : 1
        },
        {
            "song" : "Grace",
            "version" : 2
        },
        {
            "song" : "Last Goodbye",
            "version" : 1
        },
        {
            "song" : "Last Goodbye",
            "version" : 2
        },
    ]
}

我尝试了以下投影:

    db.tabs.aggregate(
    [
        {
            $project : {
                artist : 1,
                tabs.song : "$songs.name",
                tabs.version : "$songs.tabs.version"
            }
        }
    ]
)

但我得到了:

{
    "artist" : "Jeff Buckley",
    "tabs" : {
        "version" : [[2,1],[2,1]],
        "song" : ["Grace","Last Goodbye"]
    }
}

有人能指出我正确的方向吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

您的汇总查询不正确$project仅影响您的json文档密钥

像你这样的聚合查询

 db.tabs.aggregate(
                 {$unwind  : "$songs"},
                 {$unwind  : "$songs.tabs"},
                 {$group   : {
                             _id:"$artist",
                             tabs:{$push : {song : "$songs.name",version:"$songs.tabs.version"}}}},
                 {$project : {
                              tabs:"$tabs",
                              artist:"$_id",
                              _id:0}}
                 ).pretty()