2017-02-24 73 views
0

我正在使用NodeJS和Mongodb在後端的Foursquare API。我擁有存儲在集合中的所有用戶信息和簽入歷史記錄。所以收集看起來類似於這樣的:如何從Mongodb集合中的數組中提取分組結果

{ 
    _id: ..., 
    foursquareId: ... 
    personalInfo: {}, 
    checkins: [ 
     { 
      id: ..., 
      createdAt: 123456789 //Seconds since epoch>, 
      venue: {}, 
      ... 
     }, 
     { 
      id: ..., 
      createdAt: 123456789 //Seconds since epoch>, 
      venue: {}, 
      ... 
     }, 
     ... 
    ] 
} 

對於這個問題,我只對checkins數組感興趣。我需要按月份和年份返回檢入數量的列表,但我不確定哪種方法是最好的方法。我認爲結果會是這樣的:(我不完全相信,雖然)

{ 
    '2016': { 
     'January': 43, 
     'February': 38, 
     'March': 40, 
     'April': 48, 
     'May': 50, 
     'June': 41, 
     'July': 39, 
     'August': 38, 
     'September': 30, 
     'October': 29, 
     'November': 38, 
     'December': 41 
    }, 
    '2017': { 
     'January': 55, 
     'February': 20 
    } 
} 

我不感興趣,我大概收到了前端信息的方式。 我想知道是否有可能在mongodb中這樣做,因爲我找不到在他們的文檔或任何其他示例中執行此操作的方法。否則,我可能需要在前端執行它(不是一個好主意......所以我可以在這個數組上有大約7k個結果或更多...)。

回答

1

使用聚合框架應該得到你想要的。

db.collectionName.aggregate([ 
{$unwind:'$checkins'}, 
{ 
    $project: { 
     id: 1, 
     'checkins.createdAt' : 1, 
     newDate : { 
      $add : [ new Date(0), { 
       $multiply : [ "$checkins.createdAt", 1000 ] 
      }] 
     } 
    } 
}, 
{$project : { 
    year: {$year: "$newDate"}, 
    month: {$month: "$newDate"} 
}}, 
{$group: {_id:{year:"$year", month:"$month"}, count:{$sum:1}}}, 
{$group: {_id:{year:"$_id.year"}, monthTotals: { $push: { month: "$_id.month", count: "$count" } }}} 
]) 

這將產生類似文件如下:

{ 
    "_id" : { 
     "year" : NumberInt(2016) 
    }, 
    "monthTotals" : [ 
     {"month" : NumberInt(1),"count" : NumberInt(2)} 
     {"month" : NumberInt(2),"count" : NumberInt(3)} 
    ] 
} 

第二步(第一$項目步驟)可能需要根據如何自紀元值的日期存儲進行調整,但這應該得到你一般都是你需要的。

沒有一種方法可以完全按照您所描述的方式獲取數據,而無需對結果進行一些後處理,但它應該足夠簡單以修改結果。

+0

謝謝@anztenney。這絕對是要走的路。日期中發生了一些奇怪的事情(存儲爲字符串,我在使用parseInt時遇到問題),但我會自己處理。 – newpatriks

+0

如果您需要幫助,請在評論中發佈格式。 – anztenney