我有一大堆数据,我试图从Mongo(节点js)中提取数据,以便渲染一些图形。
我需要从几千名用户那里获取最近7天的数据。每个用户的特定数据格式如下:
{
"passedModules" :
[{
"module" : ObjectId("53ea17dcac1d13a66fb6d14e"),
"date" : ISODate("2014-09-17T00:00:00.000Z")
},
{
"module" : ObjectId("53ec5c91af2792f1112554e8"),
"date" : ISODate("2014-09-17T00:00:00.000Z")
},
{
"module" : ObjectId("53ec5c5baf2792f1112554e6"),
"date" : ISODate("2014-09-17T00:00:00.000Z")
}]
}
目前我有一组非常混乱的查询正在运行,但我相信这可以完全与Mongo一起完成吗?
基本上,我需要以动态的方式将所有条目从7天前提取到现在。
是否有一种尝试和测试方式以这种方式处理动态日期,更具体地说是使用mongo中的聚合框架?聚合框架的原因是我需要在之后对这些进行分组。
非常感谢
答案 0 :(得分:5)
此类查询的一般模式是:
// Compute the time 7 days ago to use in filtering the data
var d = new Date();
d.setDate(d.getDate()-7);
db.users.aggregate([
// Only include the docs that have at least one passedModules element
// that passes the filter.
{$match: {'passedModules.date': {$gt: d}}},
// Duplicate the docs, one per passedModules element
{$unwind: '$passedModules'},
// Filter again to remove the non-matching elements
{$match: {'passedModules.date': {$gt: d}}}
])
答案 1 :(得分:0)
@JohnnyHK 已经有了很好的答案。但是,如果您使用的是查询工具(如 Robot3T 或 Metabase)并且没有创建和更改变量的编程访问权限,那么这里有另一种选择。
{
"$match": {
"$expr":{
"$gte":[
"$passedModules.date",
{ $add: [new Date(), -604800000]}
]
}
}
}
其中数字 604800000
只是以毫秒为单位的时间:1000*60*60*24*<Number of Days>
您也可以将其与周或月相关。
{
"$match": {
"$expr":{
"$eq":[
{ $add:[ {$multiply:[1000, { $year: ["$passedModules.date"] }]}, { $week: ["$passedModules.date"] } ]},
{ $add:[ {$multiply:[1000, { $year: [new Date()] }]}, { $week: [new Date()] } ]}
]
}
}
},
希望它能帮助和我一样的人。