【问题标题】:MongoDB Node.js group by calculated keyMongoDB Node.js 按计算键分组
【发布时间】:2015-02-10 22:11:51
【问题描述】:

我是 Mongo Node.js 驱动程序的新手。我的问题是,我在 Mongo 中设置了一个时间戳(以毫秒为单位)字段,现在我尝试按秒对其进行分组。时间戳是一个数字(Int64),我想将它分组并除以 1000 进行计数。

我的 MongoDB Shell 查询工作正常:

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);
});

看起来好像 group 从来没有注意到 keyf 函数。有什么想法吗?

【问题讨论】:

  • 您是否尝试过为此使用聚合框架?它比服务器端的 javascript 方法更快。问题是我认为很难在聚合框架中实现 truncation-by-division-by-1000 逻辑。你能解释一下这个要求是从哪里来的吗?您有一个以毫秒为单位的时间,并且您想按秒对文档进行分组?
  • 是的,没错。我想按秒分组,而我只有几毫秒。要求是我想测量性能,并且我必须以 milis 为单位计算它,以便在不同的计算中精确。另一方面,我希望有几秒钟的时间可以将其放入带有数字的图表(绘图)中。在服务器中聚合它,就是做 DB 的用途。另一个解决方案(我在网上找不到)是将查询发送到数据库并将结果返回给服务器。在 node.js 中。
  • 如果您的时间戳是日期类型而不是数字,它将在聚合框架中工作。我总是建议使用日期类型作为时间值。可以换吗?
  • 我不确定。我必须在 Java 应用程序中做时间戳,这将它全部放入 mongo。我不能直接在数据库上制作时间戳。我不知道是否可以在运行的 Java 程序中执行这样的 mongo 时间戳。很公平,那么问题就很简单了,我承认。

标签: javascript node.js mongodb


【解决方案1】:

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);
});

【讨论】:

  • 经过一番研究,我发现了 Model 的东西,我可以看到它来自 Mongoose 包,而我正在使用 mongodb 包。不过,我不想更新它,我需要先将它按时间戳除以 1000 聚合,然后再计算。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-13
  • 1970-01-01
  • 2016-06-17
  • 2014-10-15
  • 2016-07-03
  • 2019-03-09
  • 2021-11-11
相关资源
最近更新 更多