2017-01-02 28 views
3

對不起的數組,如果標題本身就是一個矛盾:) JS初學者在這裏..Node.js的遍歷對象異步

我得到的MongoDB文檔的數組,我想對每一個與另一個對象(從另一個表),以便我可以將這個擴展對象數組傳遞給我的視圖。我想實現這樣的事情:

exports.myFunction = function(req, res) { 
    Book.find({'good': true}).exec(function(err, docs) { // find good books 
     // add authors to each book (?): 
     for (var i = 0, i < docs.length; i++) { 
      docs[i].author = Author.findOne({'_id': docs[i].author_id}); 
     } 
     // render books: 
     res.render('/books.ejs', {books: docs}); 
    }); 
} 

我認爲這不是JavaScript的方式來做到這一點:)所以我怎麼能做到這一點?

感謝,

回答

2

使用$lookup功能的聚合框架中。下面的例子演示瞭如何運用你的情況:

exports.myFunction = function(req, res) { 
    Book.aggregate([ 
     { "$match": { "good": true } }, 
     { 
      "$lookup": { 
       "from": "authors" 
       "localField": "author_id", 
       "foreignField": "_id", 
       "as": "author" 
      } 
     }, 
     { "$unwind": "author" } 
    ]).exec(function(err, docs) { 
     res.render('/books.ejs', {books: docs}); 
    }); 
} 
1

我找到了另一種解決方案,這是使用populate

對於這一點,我需要從改變我的書模型,

var mongoose = require('mongoose'); 

var bookSchema = mongoose.Schema({ 
author_id: String, 
good: Boolean 
}); 

到:

var mongoose = require('mongoose'); 
var Author = require('./author.js'); // added this 

var bookSchema = mongoose.Schema({ 
author: { type: mongoose.Schema.Types.ObjectId, ref: 'Author' }, 
good: Boolean 
}); 

我連鎖populate()我的初步查詢作爲如下:

exports.myFunction = function(req, res) { 
    Book.find({'good': true}).populate('author').exec(function(err, docs) { // find good books 
     // render books: 
     res.render('/books.ejs', {books: docs}); 
    }); 
}