誰かが次の状況の解決策を教えてくれますか?
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);
});
}