迭代一个mongoDB集合,对每一项执行一个异步的Aggregation任务,当它们都完成后return JSON在Response中
Iterate over a mongoDB collection, perform an asynchronous task of Aggregation for each item, and when they’re all done return JSON in Response
尝试从 MongoDB 集合的列表中聚合一些数据,当对所有集合进行聚合时,我想 return 所有合适的集合的完整聚合,名称和聚合值作为 JSON 对象返回。
node.js 编程新手,因此无法解决这个微不足道的问题。任何帮助表示赞赏
代码:
app.get('/tester', (req, res) => {
var AggArr = [];
db.listCollections().toArray(function (err, collInfos) {
async.forEachOf(collInfos, (value, key, callback) => {
aggregate(value);
}, err => {
if (err)
console.error(err.message);
// configs is now a map of JSON data
res.send(JSON.stringify(AggArr));
});
});
function aggregate(collname) {
if (collname.name.includes("_tps")) {
db.collection(collname.name).aggregate([{
$match: {
$and: [{
TIME: {
$gte: new Date("2017-01-01T00:00:00Z")
}
}, {
TIME: {
$lte: new Date("2017-12-31T23:59:59Z")
}
}
]
}
}, {
$group: {
_id: collname.name,
sum: {
$sum: "$TPS"
}
}
}
]).toArray(
(err, result) => {
if (err) {
return console.log(err)
} else {
if (Object.keys(result).length === 0) {}
else {
console.log(result[0]);
AggArr.push(result[0]);
}
}
})
}
}
})
我是 Node.js 编程的新手,遇到了这个小问题,非常感谢任何帮助。
以上工作流程可以重构为如下
const pipeline = collectionName => (
[
{ '$match': {
'TIME': {
'$gte': new Date("2017-01-01T00:00:00Z"),
'$lte': new Date("2017-12-31T23:59:59Z")
}
} },
{ '$group': {
'_id': collectionName,
'sum': { '$sum': "$TPS" }
} }
]
);
db.listCollections().toArray((err, collInfos) => {
const agg = collInfos
.filter(col => col.name.includes("_tps"))
.map(col => db.collection(col.name).aggregate(pipeline(col.name)).toArray());
Promise.all(agg).then(data => {
const results = data.map(d => d[0]);
res.send(JSON.stringify(results));
});
});
当您 return 回复任何查询时,它应该如下所示。它将以 JSON
格式给出响应。
app.get('/tester', (req, res) => {
//DB Operaations
if (success) {
res.status(200).json(success);
} else {
res.status(500).json({
message: 'Something went wrong'
});
}
});
尝试从 MongoDB 集合的列表中聚合一些数据,当对所有集合进行聚合时,我想 return 所有合适的集合的完整聚合,名称和聚合值作为 JSON 对象返回。 node.js 编程新手,因此无法解决这个微不足道的问题。任何帮助表示赞赏
代码:
app.get('/tester', (req, res) => {
var AggArr = [];
db.listCollections().toArray(function (err, collInfos) {
async.forEachOf(collInfos, (value, key, callback) => {
aggregate(value);
}, err => {
if (err)
console.error(err.message);
// configs is now a map of JSON data
res.send(JSON.stringify(AggArr));
});
});
function aggregate(collname) {
if (collname.name.includes("_tps")) {
db.collection(collname.name).aggregate([{
$match: {
$and: [{
TIME: {
$gte: new Date("2017-01-01T00:00:00Z")
}
}, {
TIME: {
$lte: new Date("2017-12-31T23:59:59Z")
}
}
]
}
}, {
$group: {
_id: collname.name,
sum: {
$sum: "$TPS"
}
}
}
]).toArray(
(err, result) => {
if (err) {
return console.log(err)
} else {
if (Object.keys(result).length === 0) {}
else {
console.log(result[0]);
AggArr.push(result[0]);
}
}
})
}
}
})
我是 Node.js 编程的新手,遇到了这个小问题,非常感谢任何帮助。
以上工作流程可以重构为如下
const pipeline = collectionName => (
[
{ '$match': {
'TIME': {
'$gte': new Date("2017-01-01T00:00:00Z"),
'$lte': new Date("2017-12-31T23:59:59Z")
}
} },
{ '$group': {
'_id': collectionName,
'sum': { '$sum': "$TPS" }
} }
]
);
db.listCollections().toArray((err, collInfos) => {
const agg = collInfos
.filter(col => col.name.includes("_tps"))
.map(col => db.collection(col.name).aggregate(pipeline(col.name)).toArray());
Promise.all(agg).then(data => {
const results = data.map(d => d[0]);
res.send(JSON.stringify(results));
});
});
当您 return 回复任何查询时,它应该如下所示。它将以 JSON
格式给出响应。
app.get('/tester', (req, res) => {
//DB Operaations
if (success) {
res.status(200).json(success);
} else {
res.status(500).json({
message: 'Something went wrong'
});
}
});