0

我有这样的数据,

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

我想通过艺术家对 SQL 组进行等效处理,以{ album: album, year: year }使用 mongodb 聚合生成对象列表。

我有这个查询,这几乎是我想要的,但我认为它不是正确的方法。

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 回答