누군가 다음 상황에 대한 해결책을 제시 할 수 있습니까?NodeJS (express) + MongoDB에서 검색된 결과에 더 많은 속성 추가 -SQL 시뮬레이션
로깅 응용 프로그램을 nodeJS express 프레임 워크로 작성하고 MongoDB 콜렉션을 사용합니다. 나는 컬렉션에서 결과를 얻을 수 있었지만 결과를 반복하고 첫 번째 쿼리의 참조 ID를 기반으로 다른 컬렉션을 쿼리 한 다음 초기 결과에 더 많은 값을 추가 한 다음 클라이언트에 응답을 보냅니다.
내가 코딩 한 내용을 아래에 붙여 넣겠습니다.하지만 제대로 작동하지 않습니다. 나는 그것을 잘못하고 있거나 내 원하는 논리가 옳지 않다.
비동기 JS 함수 밖에서 결과를 사용할 수 없다는 이론과 사실 이상으로 도와주세요.
미리 감사드립니다.
CODE :
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);
});
}
지루한 설명과 답장을 보내 주셔서 감사합니다. 이것은 정확히 내가 필요로하고 예상대로 작동합니다. 또한,이 논리가 어떻게 보이기로되어 있었는지 이제는 더 명확 해졌습니다. 너는 그 사람이야! 멋진 한 주를 보내십시오! –