2016-09-22 80 views
0

我有一个集合,我想要聚合,使特定的字段不同,但也将其他字段数据添加到该聚集的结果。下面是将一些数据添加到不同的查询中mongodb

{ 
     "_id": ObjectId("57d6bc99e4b014fc13cf9579"), 
     "_class": "hbservlet.FinalSubmissions", 
     "active": true, 
     "mappedTracks": 
     [ 
      { "position": 0, "title": "01. Ain't No Time.mp3", "url": "/published/music/tr157d6bc99e4b014fc13cf9579_.aac" }, 
      { "position": 1, "title": "02. In Her Mouth.mp3", "url": "/published/music/tr257d6bc99e4b014fc13cf9579_.aac" }, 
      { "position": 2, "title": "03. Maybach.mp3", "url": "/published/music/tr357d6bc99e4b014fc13cf9579_.aac" } 
     ], 
     "createdBy": ObjectId("57d6bb99b17ee01a5427af08"), 
     "userId": ObjectId("57d6bb99b17ee01a5427af08"), 
     "artistname": "test", 
    }, { 
     "_id": ObjectId("14d6bc99ebc942fc13cf9579"), 
     "_class": "hbservlet.FinalSubmissions", 
     "active": false, 
     "mappedTracks": [ 
      { "position": 0, "title": "partysong.mp3", "url": "/published/music/tr114d6bc99ebc942fc13cf9579_.aac" }, 
      { "position": 1, "title": "outside", "url": "/published/music/tr214d6bc99ebc942fc13cf9579_.aac" },], 
     "createdBy": ObjectId("57d6bb99b17ee01a5427af08"), 
     "userId": ObjectId("57d6bb99b17ee01a5427af08"), 
     "artistname": "mynameismyname", 
    } 

我用的是不同的查询(db.published.distinct(“mappedTracks”))来收集我收藏的一个例子所有mappedTracks,所以我得到这个

{ "position": 0, "title": "01. Ain't No Time.mp3", "url": "/published/music/tr157d6bc99e4b014fc13cf9579_.aac" }, 
{ "position": 1, "title": "02. In Her Mouth.mp3", "url": "/published/music/tr257d6bc99e4b014fc13cf9579_.aac" }, 
{ "position": 2, "title": "03. Maybach.mp3", "url": "/published/music/tr357d6bc99e4b014fc13cf9579_.aac" }, 
{ "position": 0, "title": "partysong.mp3", "url": "/published/music/tr114d6bc99ebc942fc13cf9579_.aac" }, 
{ "position": 1, "title": "outside", "url": "/published/music/tr214d6bc99ebc942fc13cf9579_.aac" } 

这是我想要的结果,但我也想添加它所属的文档的_id,userID,artistname到创建的新对象。

回答

0

您可以试试MongoDB aggregation运营商$unwind$group。例如:

db.collection.aggregate([ 
      {$unwind:"$mappedTracks"}, 
      {$group:{_id: 
         {mappedTracks:"$mappedTracks", 
         id:"$_id", 
         userId:"$userId", 
         artistname:"$artistname" 
         } 
        } 
      } 
]) 

请注意,这是假设您现在想要所有这四个字段的不同值组合。如果您只想要区分mappedTracks,则必须决定如何处理重复值为userIdartistname。如果是这种情况,请参见$first运营商在重复情况下使用第一个值。

参见集成算$project如果您想$group后重命名一些字段。

如果此查询是针对您的用例的常用查询,我会建议您重新考虑您的Data Modelling or Document Structure

+0

谢谢婉,这指出我的方向是正确的。我正在重新考虑我的文档结构以获得更高效的系统。 –