Может кто-нибудь просветить меня решением для следующей ситуации?Добавить дополнительные свойства к результатам, полученным от NodeJS (экспресс) + MongoDB - имитировать SQL-соединение
У меня есть приложение регистрации, написанное в nodeJS express framework и использующее коллекции MongoDB. Мне удалось получить результаты из коллекции, но я хочу повторить результаты, запросить другую коллекцию на основе идентификатора ссылки из первого запроса и добавить больше значений в исходные результаты, а затем отправить ответ клиенту.
Я вставлю ниже то, что я сейчас закодировал, но я не могу заставить его работать. Я либо делаю это неправильно, либо моя желаемая логика не правильная.
Пожалуйста, помогите мне с более чем теорией и тем фактом, что я не могу использовать результаты вне асинхронной функции 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);
});
}
Спасибо за ваше утомительное объяснение и ответили кодом. Это именно то, что мне нужно, и работает так, как ожидалось. Кроме того, для меня теперь стало более понятным, как должна выглядеть логика для этого. Ты мужчина! Желаю хорошей недели! –