2015-04-21 160 views
4

我在聚集以下管道:猫鼬总输出格式

$group: { 
    _id: { 
     $dateToString: { 
      format: '%Y-%m-%d', 
      date: '$created_at' 
     } 
    }, 
    num: { 
     $sum: 1 
    } 
} 

这将返回我的数据分组文件的总和,因为这样的:

[ 
    { 
     "_id": "2015-04-21", 
     "num": 1871 
    } 
] 

现在我想改变输出到这样的事情:

[ 
    ["2015-04-21", 1871] 
] 

这是可以在聚合管道内?还是我必须编写自己的转换方法?

回答

3

您可以使用$addToSet$setUnion运营商在您的管道如下:

db.collection.aggregate([ 
    { 
     "$group": { 
      "_id": { 
       "$dateToString": { 
        "format": "%Y-%m-%d", 
        "date": "$created_at" 
       } 
      }, 
      "num": { 
       "$sum": 1 
      } 
     } 
    }, 
    { 
     "$group": { 
      "_id": "$_id", 
      "A": { 
       "$addToSet": "$_id" 
      }, 
      "B": { 
       "$addToSet": "$num" 
      } 
     } 
    }, 
    { 
     "$project": { 
      "_id": 0, 
      "finalArray": { 
       "$setUnion": [ "$A", "$B" ] 
      } 
     } 
    } 
]); 

输出

/* 0 */ 
{ 
    "result" : [ 
     { 
      "finalArray" : ["2015-04-21", 1871] 
     } 
    ], 
    "ok" : 1 
} 
+1

这正是我想要的东西,受了多少蒙戈非常深刻的印象可以做。 –

+1

@woutr_be事实上,还有[** MapReduce **](http://docs.mongodb.org/manual/core/map-reduce/)操作,尽管它使用原生JavaScript函数其地图和减少操作。 – chridam

+0

也许这是一个完全独立的问题,但假设我的模式如下所示:http://pastebin.com/3eMDkysM。是否有可能通过“searchId”,然后是“created_at”对它进行分组?就像这样:http://pastebin.com/EYLBdDUA –