2016-08-06 16 views
0

Ich habe zwei Sammlungen: Frage und Antwort. Jede Antwort gehört zu einer Frage, also hat eine Antwort ihre "Frage_ID".Mongoosejs Verwendung Versprechen in einer for-Schleife

Ich mag fünf Fragen erhalten, die die meisten Antworten hat:

Answer.aggregate([ 
     { 
      $group: { 
       _id: '$question_id', 
       num_questions: { $sum: 1 }, 
      } 
     }, 
     { 
      $sort: { 
       'num_questions': -1 
      } 
     } 
    ]).then(function(answers) { 
     var result = []; 
     for(answer of answers) { 
      Question.findById(answer._id, function(err, question) { 
       result.push(question); 
      }); 
     } 
     console.log(result); 
     res.json({questions: result}); 
}); 

aber mit dem obigen Code, wird mein Ergebnis wegen des Asynchron-Mechanismus null sein.

Wie kann ich es schaffen?

Ein anderes Problem, das ich hatte, mit der Gesamtabfrage, ich kann nur Fragen haben, die mindestens eine Antwort hat. Wie kann ich die Fragen ohne Antwort bekommen?

Antwort

0
Answer.aggregate([ 
     { 
      $group: { 
       _id: '$question_id', 
       num_questions: { $sum: 1 }, 
      } 
     }, 
     { 
      $sort: { 
       'num_questions': -1 
      } 
     } 
    ]).then(function(answers) { 
     var result = []; 
     var count = 0; 
     for(answer of answers) { 
      Question.findById(answer._id, function(err, question) { 
     count++ 
       result.push(question); 
     if (count == 5) { 
     res.json({questions: result}); 
     } 
      }); 
     } 
     console.log(result); 
}); 
+0

Ihre Anfrage gibt nur eine Frage zurück. Wie könnte ich fünf bekommen? Vielen Dank ! –

+1

@Trong Lam Phan Redigiert für 5. –

+0

Vielen Dank. Könnten Sie mir bitte mit meiner zweiten Frage helfen? Über einige Fragen, die keine Antwort haben. Wie kann ich sie zeigen? –

0

Eine bessere Möglichkeit wäre ein Versprechen Bibliothek wie Q verwenden, die Sie mit diesen Dingen hilft. Mit Q ist es einfach zu warten, bis alle Versprechen gelöst sind, ohne zusätzliche Shenanigans (wie die Verwendung einer Zählvariablen).

Answer.aggregate([ 
    { 
     $group: { 
      _id: '$question_id', 
      num_questions: {$sum: 1} 
     } 
    }, 
    { 
     $sort: { 
      'num_questions': -1 
     } 
    } 
]).then(function (answers) { 
    var promises = []; 
    for (answer of answers) { 
     promises.push(Question.findById(answer._id).exec()); 
    } 

    Q.all(promises).then(function(questions) { 
     res.json({'questions': questions}); 
    }); 
}); 
Verwandte Themen