2013-08-05 56 views
2

在我的數據庫中,我有上百萬的文件。他們每個人都有時間戳。有些人有相同的時間戳。我想得到一些點(幾百或幾千甚至更多)來繪製一個圖。我不想要所有的觀點。我希望每拿n分我拿1分。我知道有聚合框架,我嘗試過。這是因爲我的數據很大。當我做聚合工作時,結果超過文檔最大尺寸,容易16MB。在mongodb中還有一個名爲skip的函數,但它只跳過前n個文檔。有沒有很好的方法來實現我想要的?或者有辦法讓聚合結果更大?提前致謝!MongoDB中獲取數百個數據出數以百萬計的數據

+0

我沒有在很長一段時間使用蒙戈,但不能運行地圖減少和輸出漏斗一個或多個臨時集合? – JohnP

+0

感謝您的回覆。我認爲mapreduce將會過慢,儘管它與聚合組具有相同的效果。 – user1849043

+2

爲了克服16MB的限制,M/R是很長的路要走。如果速度太慢,檢查的唯一方法就是測量它。如果你的收藏會變得非常大,那麼考慮'sharding'。在這種情況下,M/R作業將被自動分配到每個分片並行。 –

回答

1

我不知道你怎麼可與A/F或M/R做到這一點 - 只要跳過讓您有(FE)各10點是不是M/R允許你這樣做,除非你選擇每個點基於一個10%變化的隨機值......這可能不是你想要的。但這並工作:

db.so.output.drop(); 
db.so.find().count(); 

map = function() { 
    // rand does 0-1, so < 0.1 means 10% 
    if (Math.random() < 0.1) { 
     emit(this._id, this); 
    } 
} 

reduce = function(key, values) { 
    return values; 
} 

db.so.mapReduce(map, reduce, { out: 'output' }); 
db.output.find(); 

,輸出的東西線:

{ 
    "result" : "output", 
    "timeMillis" : 4, 
    "counts" : { 
     "input" : 23, 
     "emit" : 3, 
     "reduce" : 0, 
     "output" : 3 
    }, 
    "ok" : 1, 
} 
> db.output.find(); 
{ "_id" : ObjectId("51ffc4bc16473d7b84172d85"), "value" : { "_id" : ObjectId("51ffc4bc16473d7b84172d85"), "date" : ISODate("2013-08-05T15:24:45Z") } } 
{ "_id" : ObjectId("51ffc75316473d7b84172d8e"), "value" : { "_id" : ObjectId("51ffc75316473d7b84172d8e") } } 
{ "_id" : ObjectId("51ffc75316473d7b84172d8f"), "value" : { "_id" : ObjectId("51ffc75316473d7b84172d8f") } } 

或:

> db.so.mapReduce(map, reduce, { out: 'output' }); 
{ 
    "result" : "output", 
    "timeMillis" : 19, 
    "counts" : { 
     "input" : 23, 
     "emit" : 2, 
     "reduce" : 0, 
     "output" : 2 
    }, 
    "ok" : 1, 
} 
> db.output.find(); 
{ "_id" : ObjectId("51ffc4bc16473d7b84172d83"), "value" : { "_id" :  ObjectId("51ffc4bc16473d7b84172d83"), "date" : ISODate("2013-08-05T15:24:25Z") } } 
{ "_id" : ObjectId("51ffc4bc16473d7b84172d86"), "value" : { "_id" : ObjectId("51ffc4bc16473d7b84172d86"), "date" : ISODate("2013-08-05T15:25:15Z") } } 

根據隨機因素。

+0

這看起來不是一個很好的解決方法,可以選擇「n」個點(因爲它實際上是隨機結果)。 – WiredPrairie

+0

但它是一個有趣的想法。謝謝! – user1849043