Node.js异步循环遍历对象数组

3

如果标题本身有矛盾之处,我很抱歉 :) 我是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个回答

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

为此,我需要更改我的Book模型,

从:

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});
    });
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接