2017-02-15 113 views
2

我確實有類似下面超過十億對象的表:MongoDB的彙總查詢64 MB限制

{ 
    "_id" : ObjectId("5893ae4f7a5449caebba5848"), 
    "id" : NumberLong(1234567890), 
    "inserted_at" : ISODate("2017-02-02T22:10:23.812Z") 
} 

它保存在MongoDB的3.2.11。

我每週插入近5000萬條新記錄,需要比較新的一週記錄和前一週的記錄。

因此,我建立了一個這樣的查詢:

db.getCollection('table').aggregate(
    [ 
     {"$group" : { 
      "_id": { 
       "year": { "$year": "$inserted_at"}, 
       "week": { "$week": "$inserted_at"}}, 
      "Content_IDs": { "$push": "$id"}}}, 
     { "$sort": {'_id.year': -1, '_id.week': -1}}, 
     { "$limit": 2}, 



     { "$group": { 
      "_id": null, 
      "Last": { $first: "$Content_IDs" }, 
      "Previous": { $last: "$Content_IDs"} 
     }}, 

     { $project: { 
      "Outgoing": { $setDifference: [ "$Previous", "$Last" ] }, 
      "Incoming": { $setDifference: [ "$Last", "$Previous" ] }}}, 
    ], 
    {allowDiskUse:true} 
) 

但是MongoDB中無法計算,因爲數據的大小的結果。

該錯誤是如下:

斷言:命令失敗:{ 「OK」:0, 「ERRMSG」: 「BufBuilder試圖 成長()到134217728個字節,過去的64MB極限」 「代碼」:13548}

我已經嘗試了所有記錄讀取到Python的包膜,這樣我可以有計算的結果,但我得到了同樣的錯誤,當我運行pymongo.aggregate以下管道:

[ 
      {"$group" : { 
       "_id": { 
        "year": { "$year": "$inserted_at"}, 
        "week": { "$week": "$inserted_at"}}, 
       "Content_IDs": { "$push": "$id"}}}, 
      { "$sort": SON([('_id.year', -1), ('_id.week', -1)])}, 
      { "$limit": 2} 
     ] 

它適用於較小規模的數據。我怎樣才能使這個查詢更具擴展性?有什麼建議麼?

非常感謝!

回答

0

我面臨着類似的問題,我開始使用Spark(和Scala)來操縱我的數據。沒有太多的內存限制,您可以在集羣中使用並且比nodejs快。

+0

我想我需要澄清一些。我對Spark和Scala都沒有任何專業知識。 您是否建議使用-Spark,即通過MongoDB Connector for Spark與MongoDB一起使用?在這種情況下,MongoDB是否可以向Spark提供大量數據進行處理,但無法提供給Python? 謝謝 – user2386488

+0

嘿,Spark有Scala和Python的連接器,顯然這兩個工作正常。我只是覺得mongodb standalone無法處理工作。 Spark將分發數據並執行一些技巧來執行分析。但請注意,我是新手,所以我可能會說大量的廢話 –