有人可以为我提供以下情况的解决方案吗?
我有一个用 nodeJS express 框架编写并使用 MongoDB 集合的日志记录应用程序。我设法从集合中获取结果,但我想迭代结果,根据第一个查询中的参考 ID 查询另一个集合,并将更多值附加到初始结果,然后将响应发送给客户端。
我将在下面粘贴我现在编码的内容,但我无法让它工作。我要么做错了,要么我想要的逻辑不正确。
请帮助我了解更多理论以及我无法在异步 JS 函数之外使用结果这一事实。
提前致谢!
代码:
exports.findLogs = function(req, res) {
var params = req.body;
var query = req.query;
var coll = params.section;
if (coll === undefined) {
coll = 'traces';
}
db.collection(coll, function(err, collection) {
collection.count(function(err, count) {
var criteria = {
'limit': limit,
'skip': skip,
'sort': [[options.sortname, options.sortorder]]
}
collection.find({}, criteria).toArray(function(err, items) {
Object.keys(items).forEach(function(logIndex) {
var trace = items[logIndex];
var crit = {
'find': {LogId: trace.LogId},
'projection': {},
'limit': 1
}
// Get entry based on Criteria from `log` table
findOneBy(crit, 'log', function(err, log) {
if (log.length !== 1) {
// no reference found
} else {
// Appending here to log DOES NOT stick as expected
trace.ComputerName = log.ComputerName;
trace.ComputerIP = log.ComputerIP;
trace.LastSeen = log.LastSeen;
trace.TestVar = 'test1234';
}
});
// Appending here to trace works as expected
trace.Actions = 'MyAction';
});
results['total'] = count;
results['results'] = items.length;
results['rows'] = items;
res.send(results);
});
});
});
}
function findOneBy(criteria, coll, callback) {
var cFind = criteria.find;
var cProj = criteria.projection;
db.collection(coll, function(err, collection) {
if (err) return callback(err);
else return collection.find(cFind, cProj).toArray(callback);
});
}