我有一个脚本,用于计算MongoDB中每个集合的平均卷
数据。 但是,由于我有超过1000天的记录,我希望只计算最近200天的平均量
。
目前我的脚本采取的整个数据,这是在收集(1000天+)。
目标:如何设置最近200天的范围,以计算它们的平均体积
。 还有一件很重要的事,就是我每天还想用上200天。
平均聚合框架
const saveToDatebase = async(symbol, BTCdata) => {
try {
const url = 'mongodb://username:passwprd@ipaddress/port?retryWrites=true&w=majority';
let dateTime = getDateTime();
let db = await MongoClient.connect(url, { useUnifiedTopology: true });
const dbo = db.db('Crypto');
const myobj = Object.assign({ Name: symbol, Date: dateTime }, BTCdata[0]);
await dbo.collection(symbol).insertOne(myobj);
const average = await dbo.collection(symbol).aggregate([{
'$group': {
_id:null,
'Volume': {
'$avg': '$Volume'
}
}
}]).toArray();
console.log('1 document inserted');
console.log(average);
db.close();
} catch (e) {
console.error(e)
}
};
编辑如下代码后的EDIT1>>
const average = await dbo.collection(symbol).aggregate([{
$match: {
$gte: ["$dateTime", { $subtract: ["$$NOW", 200 * 60 * 60 * 24 * 1000] }]
},
"$group": {
_id: null,
"Volume": {
"$avg": "$Volume"
}
}
}]).toArray();
我收到此错误>; MongoError:管道阶段规范对象只能包含一个字段。
编辑2代码在有如下代码之后,我收到这个错误-mongoerror:未知的顶级操作符:$gte
const average = await dbo.collection(symbol).aggregate([{
$match: { $gte: ["$dateTime", { $subtract: ["$$NOW", 200 * 60 * 60 * 24 * 1000] }] }
},
{
"$group": {
_id: null,
"Volume": {
"$avg": "$Volume"
}
}
}
])
下面是MongoDB中文档的样子。
在对文档进行分组之前,必须对它们进行筛选。 应该是这样的:
db.collection.aggregate([
{
$match: {
$expr: {
$gte: [
"$dateTime",
{
$subtract: [
"$$NOW",
200*60*60*24*1000
]
}
]
}
}
},
{
"$group": {
_id: null,
"Volume": {
"$avg": "$Volume"
}
}
}
])