如何在NodeJS中从MongoDB读取嵌入的文档数据后发送响应

时间:2017-01-04 14:46:24

标签: javascript node.js mongodb

我在MongoDB中有一个文档,它包含对其他两个文档的引用。我有get rest API,它还返回带有引用文档详细信息的对象。我写了吹响代码。代码正在运行,但是由于异步读取功能,我得到的响应是空的.router.get(“/”,function(req,res){

LibraryTransaction.find({},function(err,data){

    if(err){
        res.send(err.message);
    }
    else{

        var transactions=[];
        data.forEach(function(element){                                 
            debugger;
            var transaction ={}; 
            var BookName='';
            var ISBNNumber='';
            var UserName='';



            Book.findOne({_id:element.book},function(err,book){
                debugger;

                if(!book){
                    res.send("Book not found please check ISBN number.");
                }
                else{           

                    BookName = book.name;
                    ISBNNumber= book.isbnNumber;
                    User.findOne({_id:element.user},function(err,user){
                        debugger;
                        if(!user){
                            res.send("User not found.");
                        }
                        else
                        {
                            UserName=user.userName;
                            transaction.bookName=BookName;
                            transaction.iSBNNumber=ISBNNumber;
                            transaction.userName=user.userName;
                            transaction.IssueDate=element.issueDate;
                            transaction.DueDate=element.dueDate;
                            transaction.TransactionType=element.transactionType;    
                            console.log(BookName);;
                            transactions.push(transaction);
                        }
                    });         
                }
            });                 
        });
        console.log("Send");
        res.send(transactions);         
    }
});

}); `

我有一份交易文件,其中包含书籍和用户文档以及bookIssueDate,DueDate等其他一些细节。我想返回包含书名,用户名和书籍发行日期,预订截止日期的数据。但作为回应,我只获得了Book发布日期和Due dtae数据,但没有获得图书名称和用户名。但是读取该数据的代码形成了resoective文档。

有人可以帮我理解在Node.js中处理这个问题的正确方法吗?

1 个答案:

答案 0 :(得分:0)

在这种情况下,只需一个快速重构,将所有ID映射到一个数组中,然后在该数组中找到所有带有_id的书籍,在该查询之后您拥有所有书籍并且可以操纵它们。显然,在回叫中做res.send或任何你想做的事。



LibraryTransaction.find({},function(err,data){

    if(err){
        res.send(err.message);
    }
  
    else{

        var transactions=[];
        var bookIds = data.map(function(element) { return element.book; });
      
        Book.find({ _id: { $in: bookIds }}, function(err, books) {
          
          // Do whatever with books and send back the response, with res.. blah!
          
        });       
    }
});