2017-12-29 47 views
0

Ich habe diese Kollektionen:Knoten und Mongo - Mehrere Sammlung Anrufe in einem Verfahren

sessão:

{ 
    "_id" : ObjectId("5a450a30ca4b001587fcf967"), 
    "cliente" : ObjectId("5a1407c8099ca208e48170a5"), 
    "data" : "28/12/2017", 
    "numero" : "11", 
    "dadosORS" : ObjectId("5a4507d451c2c614a788c120"), 
    "dadosSRS" : ObjectId("5a465bcbca4b001587fcf968") 
} 

registosORS:

{ 
    "_id" : ObjectId("5a450a30ca4b001587fcf966"), 
    "sessao" : "11", 
    "outroResponsavel" : "", 
    "relacao" : "", 
    "valorIndividualmente" : "1", 
    "valorInterpessoal" : "1", 
    "valorSocialmente" : "1", 
    "valorGlobalmente" : "1", 
    "email" : "[email protected]", 
    "data" : "28/12/2017", 
    "somaValoresOrs" : 4 
} 

und registosSRS:

{ 
    "_id" : ObjectId("5a465bcbca4b001587fcf968"), 
    "sessao" : "11", 
    "valorRelacao" : "7.18", 
    "valorObjectivo" : "5.06", 
    "valorAbordagem" : "5.18", 
    "valorGeral" : "5.37", 
    "cliente_id" : "5a1407c8099ca208e48170a5", 
    "email" : "[email protected]", 
    "somaValoresSrs" : 22.79, 
    "data" : "29/12/2017" 
} 

Jetzt muss ich alle Sitzungen für eine bestimmte cliente_id, sowie die ORS- und SRS-Daten auflisten.

Ich mache eine Funktion im Modell, um diese Informationen aufzulisten, aber das funktioniert nicht. Ich dachte, ich könnte nach allen Sessions dieser Clientid suchen und dann mit den IDs dadosORS und dadosSRS ein Array mit diesen Daten erstellen, aber die Arrays sind außerhalb der for nicht definiert.

ClientesDAO.prototype.dadosORSSRSSession = function(clienteid, callback){ 
    var client_id = new ObjectId.ObjectID(clienteid); 

    this._connection.open(function(err,mongoClient){ 
     mongoClient.collection('sessao', function(err,collection){ 
      collection.find({cliente:client_id}).toArray(function(err,result){ 

       // console.log('result find das sessoes'); 
       // console.log(result); 
       var ORS_id = []; 
       var ORS_cliente = []; 
       var SRS_id = []; 
       var SRS_cliente = []; 

       for (var i=0; i<result.length; i++){ 

         ORS_id[i] = new ObjectId.ObjectID(result[i].dadosORS); 

         mongoClient.collection('registosORS', function(err,collection){ 
          collection.find({_id:ORS_id[i]}).toArray(function(err,result){ 
            ORS_cliente.push(result[0]) 
          }) 
         }) 

         SRS_id[i] = new ObjectId.ObjectID(result[i].dadosSRS); 

         mongoClient.collection('registosSRS', function(err,collection){ 
          collection.find({_id:SRS_id[i]}).toArray(function(err,result){ 
            SRS_cliente.push(result[0]) 
          }) 
         }) 
       } 

       console.log('result ORS'); 
       console.log(ORS_cliente); 
       console.log('result SRS'); 
       console.log(SRS_cliente); 

       mongoClient.close(); 

      }) 
     }) 
    }) 
} 

Antwort

0

Ich könnte ein Array mit diesen Daten erstellen, aber die Arrays sind außerhalb der für undefiniert.

Dies ist, weil DB-Aufrufe asynchron sind.

Sie können Promise und asynceachOf verwenden, um die Details in einem Array zu sammeln.

'use strict'; 

let _ = require('lodash'); 
let async = require('async'); 

ClientesDAO.prototype.dadosORSSRSSession = function (clienteid, callback) { 
    var client_id = new ObjectId.ObjectID(clienteid); 

    this._connection.open(function (err, mongoClient) { 

    mongoClient.collection('sessao', function (err, collection) { 

     if (err) { 
     console.log('err when establishing db connection', err); 
     return; 
     } 

     collection.find({ 
     cliente: client_id 
     }).toArray(function (err, result) { 

     async.forEachOf(result, function (value, key, callback) { 

      let orsId = new ObjectId.ObjectID(value.dadosORS); 
      let srsId = new ObjectId.ObjectID(value.dadosSRS); 

      Promise.all([ 
      getORSDetailsById(mongoClient, orsId), 
      getSRSDetailsById(mongoClient, srsId) 
      ]).then((results) => { 
      callback(null, { 
       ors_id: orsId, 
       srs_id: srsId, 
       ors: results[0], 
       srs: results[1] 
      }) 
      }).catch((err) => { 
      callback(err); 
      }); 

     }, function (err, result) { 
      if (err) { 
      return console.error(err.message); 
      } 

      let orsIds = _.map(result, (item) => { 
      return item.ors_id; 
      }); 

      let srsIds = _.map(result, (item) => { 
      return item.srs_id; 
      }); 

      let orsCliente = _.map(result, (item) => { 
      return item.ors; 
      }); 


      let srsCliente = _.map(result, (item) => { 
      return item.srs; 
      }); 

      console.log('orsIds', orsIds); 
      console.log('srsIds', srsIds); 
      console.log('orsCliente', orsCliente); 
      console.log('srsCliente', srsCliente); 

     }); 

     mongoClient.close(); 

     }); 
    }); 
    }); 

}; 


function getORSDetailsById(mongoClient, id) { 
    return new Promise((resolve, reject) => { 
    mongoClient.collection('registosORS', function (err, collection) { 
     collection.find({ 
     _id: id 
     }).toArray(function (err, result) { 
     if (err) { 
      return reject(err); 
     } 
     resolve(result[0]); 
     }) 
    }); 
    }); 
} 

function getSRSDetailsById(mongoClient, id) { 
    return new Promise((resolve, reject) => { 
    mongoClient.collection('registosSRS', function (err, collection) { 
     collection.find({ 
     _id: id 
     }).toArray(function (err, result) { 
     if (err) { 
      return reject(err); 
     } 
     resolve(result[0]); 
     }) 
    }); 
    }); 
} 
+0

Ich lese..aber vorher habe ich die Async und Lodash Module installiert, aber wenn ich Ihren Code ausführen, heißt es: mongoClient ist nicht definiert .. – EFO

+0

Ich nahm 'mongoClient' aus dem veröffentlichten Code-Snippet. – Sridhar

+0

Ich habe die Antwort für jeden möglichen Fehler aktualisiert, bitte überprüfen Sie jetzt – Sridhar

0

Die Arrays sind außerhalb der for undefiniert, weil sie asynchron sind, db-Operation nicht blockieren, verwenden Sie Ereignis vermeiden.

const EventEmitter = require('events'); 
class MyEmitter extends EventEmitter { } 
const myEmitter = new MyEmitter(); 

myEmitter.on('myEvent',() => { 
    console.log('result ORS'); 
    console.log(ORS_cliente); 
    console.log('result SRS'); 
    console.log(SRS_cliente); 
}) 

for (var i=0; i<result.length; i++){ 
    ORS_id[i] = new ObjectId.ObjectID(result[i].dadosORS); 
    mongoClient.collection('registosORS', function(err,collection){ 
     collection.find({_id:ORS_id[i]}).toArray(function(err,result){ 
       ORS_cliente.push(result[0]) 
     }) 
    }) 

    SRS_id[i] = new ObjectId.ObjectID(result[i].dadosSRS); 
    mongoClient.collection('registosSRS', function(err,collection){ 
     collection.find({_id:SRS_id[i]}).toArray(function(err,result){ 
       SRS_cliente.push(result[0]) 
     }) 
    }) 

    if (i == result.length-1) { 
     myEmitter.emit('myEvent'); 
    } 
} 

weitere Informationen über asynchrone controll, schlagen vor, Sie sehen Versprechen und Asynchron/await.

+0

Wo sollte ich das Ereignis 'an' setzen? Eigentlich muss ich eine Funktion mit diesen Daten zurückgeben. – EFO

Verwandte Themen