0

このようなデータがありますが、

{
    meta: {
        artist: "artist",
        album: "album",
        year: 2008
    }
}

そして、mongodb 集約を使用してオブジェクトのリストを生成するために、アーティストによる SQL グループと同等のことを行いたいと考えています{ album: album, year: year }

私はこのクエリを持っていますが、これはほとんど私が望んでいるものですが、それが正しい方法だとは思いません。

db.pending.aggregate( [ 
    { $project: 
      { 'meta.artist': 1, 'meta.album': 1, 'meta.year':1 } 
    }, 
    { $group: 
      {
       '_id': 
         { artist: '$meta.artist', album: '$meta.album', 
             year: { $year: '$meta.year'}  
         } 
      }
    }
] )
4

2 に答える 2

1

このような集約フレームワークで次のことができると思います:

db.pending.aggregate(
  {$group: {_id: '$artist', albums: {$push: {album: '$album', year: '$year'}}}}, 
  {$sort: {_id: 1}}
);

または、map reduce 関数でそれを行うことができます。

var mapFunction = function() {
                       emit(this.meta.artist, {album: this.meta.album, year: this.meta.year});
                   };

var reduceFunction = function(artistId, albumValues) {
                     var reducedObject = {
                                artisId: artistId,
                                albums: []};

                    albumValues.forEach( function(albumValue) {
                                   reducedObject.albums.push(
                                       {album: albumValue.album,
                                       year: albumValue.year}
                                        );
                                   });
                        return reducedObject;
};

db.pending.mapReduce(
                     mapFunction,
                     reduceFunction,
                     { out: { inline: 1 } }
                   )

SQLグループごとのクエリでも、やりたいことができるとは思いません。これにより、次のような結果が返されます{_id: "artisName", values[{album: 'album1', year: 'year1'}, {album: 'album2', year: 'year2'}]}

于 2013-01-26T11:16:50.510 に答える
1

$addToSet演算子が必要だと思います:

db.test.aggregate(
  { $project:
    { 'meta.artist': 1
    , 'meta.album': 1
    , 'meta.year': 1 }
  }
  , { $group:
      { _id: '$meta.artist'
      , albums: {
        $addToSet: {
          album: '$meta.album'
        , year: '$meta.year' }
      }
    }
  }
)
于 2013-01-26T11:41:47.090 に答える