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同样,这很好,但使用“查询”选项更好。您可以编写“映射”以“跳过”该修订版中的项目,但使用“查询”对输入进行“过滤”要好得多。从其他贡献者那里看到这个标准真是太好了。