2016-01-29 3 views
0

Я нашел много примеров отношений «один ко многим», но я не нашел очень четкого примера для решения вложенных запросов для нормализованных данных в «mongodb», или это только я, , Пожалуйста помоги. У меня есть следующие модели под названием «Пользователь», «Учетная запись» «Библиотека».nodejs вложенные запросы в обратном вызове

User: { 
    name: String, 
    password: String //Hash of course 
} 

Library: { 
    name: String, 
    address: String 
} 

Account: { 
    user_id: String, 
    library_id: String 
} 

Это происходит потому, что пользователь имеет множество учетных записей с различными библиотеками (я могу определенно положить их встроенные в документ «User» или библиотеки информации, содержащейся в документе «Счет»). Я пытаюсь скомпоновать (см. Ниже фрагмент), чтобы собрать все документы как один массив объектов JSON, как показано ниже, но неясно, как и где я возвращаю ответ, как в «res.json (allaccountsdata) «Может быть, есть лучший способ?

function isLoggedIn() { 
    // this validates the user and puts user object in the req 
} 

app.get('/account', isLoggedIn, function(req, res) { 
    var allaccountsdata = []; 
    Account.find({user_id: req.user._id}, function(err, accounts) { 
    account.forEach(function(account) { 
     Library.find({_id: account.library_id}, function(err, library) { 
     account.library = library; 
     allaccountsdata.push(account); // Where do I return this??? 
     }); 
    }); 
    }); 
}); 

Я знаю, что это не очень эффективно, а не реальный MongoDB путь, но я просто пытаюсь понять, как это сделать, если мои данные все нормализуется в MongoDB.

-Atarangp

+0

Я предполагаю, что вы используете это в сочетании с выражением? –

+0

да я использую экспресс. – Atarang

ответ

0

Вы можете запросить несколько элементов в на запросе. Создайте список с идентификаторами библиотеки и используйте его для поиска всех библиотек. Непроверенный пример:

Account.find({user_id: req.user._id}, function(err, accounts) { 
    // Get an array with the library IDs 
    var libraryIds = accounts.map(function(account) { 
    return account.library_id; 
    }); 
    // Find all relevant libraries in one query 
    Library.find({_id: {$in: libraryIds}}, function(err, libraries) { 
    // Join the libraries to the accounts 
    accounts.forEach(function(account) { 
     account.library = libraries.find(function(library) { 
     return library.id === account.library_id; 
     }); 
    }); 
    return res.json(accounts); 
    }); 
}); 
+0

Судно, я вернусь к вам. Благодарю. – Atarang

+0

vesse, я получаю library.find() - неопределенная ошибка функции? – Atarang

+0

@Atarang звучит как ответ (т.е. 'libraries') не является массивом, поскольку метод [find() является прототипом Array] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/ Reference/Global_Objects/Array/find) и поэтому всегда определяется для массивов. Проверьте, как выглядят возвращенные библиотеки, и соответствующим образом настройте их. – vesse

Смежные вопросы