2015-02-10 92 views
3

我是Mongo Node.js驅動程序的新手。我的問題是,我在Mongo中設置了一個時間戳(以毫秒爲單位),現在我嘗試按秒分組。時間戳是一個數字(Int64的),我想擁有它編組和由1000MongoDB Node.js組按計算鍵

我的MongoDB殼牌查詢與統計司工作正常:

db.default.group(
{ 
    keyf: function(doc) { 
    var secs = (doc.timestamp/1000).toFixed(); 
    return {'data':secs}; 
    }, 
    cond: {source:1}, 
    initial: {count:0}, 
    reduce: function(obj, prev) {prev.count++;} 
}) 

我的問題是我不能去上班我Node.js查詢:

var keyf = function(doc) { 
     var secs = (doc.timestamp/1000).toFixed(); 
     return {'data': secs}; 
}; 
collection.group(keyf, {}, {"count":0}, 
     "function(obj, prev){prev.count++;}", false, function(err,results) { 
    console.log(results); 
}); 

看起來好像組從未注意到keyf函數。有任何想法嗎?

+1

您是否嘗試過使用該聚合框架?它比服務器端JavaScript方法更快。順便說一下,我認爲在聚合框架中實現按截斷數除1000的邏輯很難。你能解釋哪些要求來自哪裏?你有毫秒的時間,你想第二個文件分組? – wdberkeley 2015-02-13 16:26:22

+0

是的,那是對的。我只想要秒,而我只有毫秒。要求是我想測量性能,並且我需要在不同的計算中以milis來計算它的精度。另一方面,我想有幾秒鐘就可以將它放入帶有數字的圖表(繪圖)中。將它聚合到服務器中,可以做數據庫的用途。另一種解決方案(我無法在網上找到)是將查詢發送到數據庫並將結果返回給服務器。在node.js中 – Tomasch 2015-02-15 17:48:25

+0

如果您的時間戳是日期類型而不是數字,它將在聚合框架中工作。我總是建議使用時間值的日期類型。你能切換嗎? – wdberkeley 2015-02-17 17:11:01

回答

0

上有collection沒有.group方法,或者你必須使用型號

Model.find({}, function(err, docs) { 
    if(err) console.error(err); 
    if(!docs) console.log("No docs found!"); 

    function updater(docs){ 
     // Get first item of documents 
     doc = docs.unshift(); 

     // Change 
     doc.timestamp = (doc.timestamp/1000).toFixed(); 

     // Update 
     doc.save(function(err){ 
      if(err) 
       console.log(err); 
      else 
       updater(docs); 
     }); 
    } 
    // Update documents in async 
    updater(docs); 
}); 
+0

經過一番研究,我發現了模型的東西,我可以看到它來自Mongoose包,而我正在使用mongodb包。儘管如此,我不想讓它更新,我首先需要用時間戳除以1000計算出來。 – Tomasch 2015-02-11 20:04:57