Node.js 按日期分组几个变量

Node.js 按日期分组几个变量,node.js,mongodb,mapreduce,mongodb-query,aggregation-framework,Node.js,Mongodb,Mapreduce,Mongodb Query,Aggregation Framework,在我的node.js项目中通过mongoose使用mongodb。 我的文档具有以下结构: { created: new Date("2014-12-24"), last_visited: new Date("2014-12-24") }, { created: new Date("2014-12-16"), last_visited: new Date("2014-12-24") }, { created: new Date("2014-12-13"), last_visited: new D

在我的
node.js
项目中通过
mongoose
使用
mongodb
。 我的文档具有以下结构:

{ created: new Date("2014-12-24"), last_visited: new Date("2014-12-24") },
{ created: new Date("2014-12-16"), last_visited: new Date("2014-12-24") },
{ created: new Date("2014-12-13"), last_visited: new Date("2014-12-13") },
{ created: new Date("2014-12-12"), last_visited: new Date("2014-12-20") },
{ created: new Date("2010-01-01"), last_visited: new Date("2014-12-20") }
我想显示在过去30天的某个日期创建/更新了多少文档。因此,输出应该如下所示:

{ date: ISODate("2014-12-12"), created: 2, last_visited: 0 },
{ date: ISODate("2014-12-13"), created: 1, last_visited: 0 },
{ date: ISODate("2014-12-16"), created: 1, last_visited: 0 },
{ date: ISODate("2014-12-20"), created: 0, last_visited: 2 },
{ date: ISODate("2014-12-22"), created: 0, last_visited: 1 },
{ date: ISODate("2014-12-24"), created: 0, last_visited: 2 },
请注意,2010年条目已被跳过,因为它比30天更早

我如何才能做到这一点?

地图缩小问题:

var old = new Date();
old.setDate(old.getDate()-30);

var filter = { created : {$gt : old}, last_visited : {$gt : old} };

var map = function()
{        
    emit(this.created, {created : 1, last_visited : 0 });      
    emit(this.last_visited, {created : 0, last_visited : 1 });    
}

var reduce = function(key, values)
{
    var out = {created : 0, last_visited : 0 };

    for(i in values)
    {
        var value  = values[i];
        if(value.created != 0)
        {
            out.created++;
        }
        else
        {
            out.last_visited++;
        }
    }

    return out;
}

db.runCommand(
               {
                 mapReduce: "test2",
                 map: map,
                 reduce: reduce,                
                 out: { "inline": 1 },
                 query: filter
               }
             ).results
试试这个

db.users.aggregate([
    {$group: {
            "_id": {
                month: {$month: "$created"},
                day: {$dayOfMonth: "$created"},
                year: {$year: "$created"},
            },
            date: {$max: '$created'},
            created: {$sum: 1},
            last_visited: {$sum: 1},
        }},
        {$sort: {
            'date': -1
        }}
])

谢谢

我可以说“我写的日期在这里很短”是一个非常可怕的表达方式。我们是否真的需要阅读您的所有内容才能意识到这些实际上是ISODate或BSON Date对象?为什么不使用30天前的日期?一点也不可怕,因为有些人可能认为日期是以文本形式存储在数据库中的,必须在查询中以某种方式转换为日期格式。不可怕。像这样的日期是一个“字符串”。它也不是“词法的”,这意味着像$gt和$lt这样的范围运算符和cossins不起作用。另外一个事实是,“字符串”比BSON日期占用更多的存储空间,BSON日期是一个带有“type”标记的“长整数”,表示它是一个日期。当您打算存储日期时,日期是有用的类型。使用任何其他方法都是错误的。为了避免任何误解,我已将日期转换为其ISODate格式(不含时区和时间段),以“避免任何误解”。我已更正您的数据,以构建有效的日期对象,并将其存储在此格式中。已锁定+1。但是你应该纠正“退出”选项,它不应该是真正有效的,也不应该是其他司机的好例子。那么我只想反映最后30天的部分问题呢?该解决方案似乎不适用于mongoose。@Quest除了在上使用查询选项(如我已经提到的)之外,它并不重要。此外,“out”应该是
{“out”:{“inline”:1}}
{“out”:{“replace”:“out”}
,如前所述。请参阅手册中的选项。@Quest,我更新了map函数,现在它将跳过旧的ones@Disposer同样,这很好,但使用“查询”选项更好。您可以编写“映射”以“跳过”该修订版中的项目,但使用“查询”对输入进行“过滤”要好得多。从其他贡献者那里看到这个标准真是太好了。