2015-02-10 85 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