Node.js и MongoDB используют результаты одного запроса в другом

Я создал модуль node.js, который уже может запрашивать у MongoDB набор документов с помощью функции поиска и вывода этих результатов в JSON. Мой вопрос заключается в том, что, зная, что node.js является асинхронным, как я могу использовать результаты этого запроса (элементы), чтобы создать запрос, который возвращается к MongoDB для поиска другого набора документов. Этот запрос в основном возвращает список идентификаторов сотрудников, которые можно использовать для запроса документов, содержащих информацию об этих сотрудниках (например, firstName, lastName и т. Д.). Затем выведите эти результаты в виде JSON. Первый запрос в основном говорит: дай мне всех сотрудников, которые могут быть просмотрены конкретным пользователем. Затем мне нужно взять идентификаторы сотрудников и выполнить запрос к другому набору документов, который содержит информацию об этих лицах, как показано ниже.

Вот схема двух документов:

Работник

{
"_id" : ObjectId("5208db78ecc00915e0900699"),
"clientId" : 1,
"employeeId" : "12345",
"lastName" : "DOE",
"firstName" : "JOHN",
"middleName" : "A",
"badge" : "8675309",
"birthDate" : "10/12/1978"
}

Пользователи, к которым сотрудник имеет доступ (кэш пользователя)

{
"_id" : ObjectId("520920a99bc417b7c5e36abf"),
"clientSystem" : "SystemX",
"customerNumber" : "1",
"clientUserId" : "jdoe3",
"securityCode" : "authorize",
"employeeId" : "12345",
"creationDate" : "2013-Aug-12 13:51:37"
}

Вот мой код:

exports.employeeList = function(req, res) {
    console.log(req.params);
    var clientSystem = req.query["clientSystem"];
    var clientUserId = req.query["clientUserId"];
    var customerNumber = req.query["customerNumber"];
    var securityCode = req.query["securityCode"];

 if (clientSystem != null && clientUserId != null && customerNumber != null && securityCode != null){
    db.collection('ExtEmployeeList', function(err, collection){
        collection.find({'clientSystem': clientSystem, 'clientUserId':clientUserId, 'customerNumber':customerNumber, 'securityCode': securityCode}).toArray(function (err, items){
             console.log(items);
             res.jsonp(items);
        });//close find
     });//close collection
}//close if
else {
   res.send(400);
}//close else
};//close function

1 ответ

Решение

То, что вы хотите сделать, возможно, но, вероятно, не самое эффективное использование Mongo. Я склонен разрабатывать монго документы о том, как данные будут фактически использоваться. Поэтому, если бы мне нужно, чтобы имена пользователей отображались в списке пользователей, которых я могу просмотреть, я бы включил эти данные, чтобы мне не приходилось совершать многократные поездки в Монго, чтобы получить всю необходимую информацию. Я хотел бы сделать что-то вроде следующего:

{
  "_id" : ObjectId("520920a99bc417b7c5e36abf"),
  "clientSystem" : "SystemX",
  "customerNumber" : "1",
  "clientUserId" : "jdoe3",
  "securityCode" : "authorize",
  "employeeId" : "12345",
  "creationDate" : "2013-Aug-12 13:51:37"
  "employee": {
    "_id" : ObjectId("5208db78ecc00915e0900699"),
    "clientId" : 1,
    "employeeId" : "12345",
    "lastName" : "DOE",
    "firstName" : "JOHN",
    "middleName" : "A",
    "badge" : "8675309",
    "birthDate" : "10/12/1978"
  }
}

Да, вы дублируете данные, но вы значительно сокращаете количество обращений к базе данных. Обычно это компромисс, который вы используете при использовании баз данных на основе документов, поскольку вы не можете объединять таблицы.

Другие вопросы по тегам