0

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

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

Сотрудник

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

Пользователи сотрудник может получить доступ (Cache User)

{ 
"_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 
+0

2 предложения - используйте '$ in' для извлечения набора документов на основе идентификатора сотрудника и посмотрите на Mongoose, поскольку это упрощает этот тип операции. – WiredPrairie

ответ

2

То, что вы хотите сделать, возможно, но, вероятно, не самое эффективное использование Монго. Я склонен проектировать 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" 
    } 
} 

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

+1

Я принял ваш совет и пересмотрел свою схему. Теперь я могу сделать один запрос, чтобы получить то, что мне нужно. – FarscapePROJ