簡體   English   中英

貓鼬數據庫從兩個文檔返回數據

[英]mongoose db returning data from two documents

我正在創建我的第一個貓鼬數據庫應用程序。 我正在嘗試編寫一個快速API調用,該調用返回一個包含兩個文檔中數據的對象。 每當我調用/ data路由時,我都會得到一個空數組。 我添加了兩條console.log行,輸出為:

test2
test1

返回結果前,我該怎么做才能使forEach完成?

這是代碼:

router.route('/data')
//get all data
.get(function(req, res) {
    var results = [];
    Attendee.find(function(err, attendees) {
        if (err) {res.send(err);}
        else {
            attendees.forEach(function(attendee) {

                Message.find({userID: attendee._id}, function(err,messages){
                    results.push({
                        attendee: attendee,
                        messages: messages
                    });
                });
                console.log("test1");
                console.log(results);
            });
            console.log("test2");
            res.json(results);
        }
    });
});

這是我想要得到的結果

[ { attendee: 
 { _id: 53c060e7fb90e3d709d6bdae,
   fullName: ‘joe smith,
   phoneNumber: '+555’,
   __v: 0 },
messages: 
 [ { _id: 53c06887fb1d24fb095fd365,
     phoneNumber: '+555',
     body: ‘test’,
     userID: '53c060e7fb90e3d709d6bdae',
     sid: 'SMa86f2914986d4b04067d7f054da205a5',
     __v: 0 },
   { _id: 53c41cf3d068393d17dc0dbf,
     phoneNumber: '+555',
     body: ‘test’,
     userID: '53c060e7fb90e3d709d6bdae',
     sid: 'SM4f6c64ca7b39e6caee9859e761a2850d',
     __v: 0 },
   { _id: 53c421e16371e54f171751cf,
     phoneNumber: '+555',
     body: ‘test’,
     userID: '53c060e7fb90e3d709d6bdae',
     sid: 'SM1097eae33e4f53cdcdad32651c016437',
     __v: 0 },
   { _id: 53c421e16371e54f171751d0,
     phoneNumber: '+555',
     body: ‘test’,
     userID: '53c060e7fb90e3d709d6bdae',
     sid: 'SM5a452e51c995d7ad6ad8f7b85cec80b0',
     __v: 0 } ] } ]

主要問題是您要在完全檢索結果之前將結果發送回響應中。 您的res.json(results)Message.find(...)回調之外。 此外,由於您在同一回調中將與會者對象推送到結果數組上,因此也將丟失該對象,並且返回的結果數組將只是原始的空數組。

您需要這樣的東西:

router.route('/data')
//get all data
.get(function(req, res) {
    var results = [];
    Attendee.find(function(err, attendees) {
        if (err) {res.send(err);}
        else {
            q.all(attendees.map(function(attendee) {
                return Message
                    .find({userID: attendee._id}, "")
                    .exec()
                    .then(function(messages) {
                        results.push({
                            attendee: attendee,
                            messages: messages
                        });         
                     })
            }))
            .then(function() {
                res.json(results);
            })
        }
    });
});

我通過使用名為populate的貓鼬功能解決了自己的問題。 http://mongoosejs.com/docs/populate.html 我能夠簡化很多代碼:

    router.route('/data')
    //get all data
    .get(function(req, res) {
        Attendee.find().populate('messages').exec(function(err, attendees){
            if (err) {res.send(err);}
            res.json(attendees);
        });
    }); 

該代碼的真正魔力在於方案:

var mongoose = require('mongoose');

var AttendeeSchema = new mongoose.Schema({
    fullName: {
        type: String,
        require: true
    },
    dateJoined: {
        type: Date,
        require: true
    },
    phoneNumber: {
        type: String,
        required: true
    },
    messages: [{
        type: mongoose.Schema.Types.ObjectId, ref: "Message"
    }]
});

module.exports = mongoose.model('Attendee', AttendeeSchema);

var mongoose = require('mongoose');

var MessageSchema = new mongoose.Schema({
    _userID: {
        type: String,
        ref: 'Attendee'
    },
    phoneNumber: {
        type: String,
        require: true
    },
    date: {
        type: Date,
        require: true
    },
    body: {
        type: String,
        required: true
    },
    sid: {
        type: String,
        required: true
    }

});

module.exports = mongoose.model('Message', MessageSchema);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM