RafaelHamasaki
RafaelHamasaki

Reputation: 53

MongoDB aggregation and projection issue

helpful people of StackOverflow!

I'm in the process of learning how to work with MongoDB, and am currently stuck with one particular problem.

I'm building a guitar tabs app, working only with an "artist" base document. All other data are subdocuments. Depending on the accessed functionality (e.g: search, list tabs by artist, view single tab), I aggregate and project my documents accordingly.

However, I can't get one projection to work as I want.

Given the following data:

{
    "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"
                }
            ]
        }
    ]
}

I want to aggregate it the following way for a list view:

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

I tried it with the following projection:

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

But instead I got:

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

Can anyone point me in the right direction?

Thanks!

Upvotes: 0

Views: 125

Answers (1)

kakashi hatake
kakashi hatake

Reputation: 1185

your aggregation query not correct $project only affect your json document keys

your aggretion query like this

 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()

Upvotes: 1

Related Questions