填充查询不显示新添加的引用项

时间:2017-03-31 08:02:13

标签: node.js mongoose mongoose-populate

我的架构如下:

items.js

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

var ItemSchema = new Schema({
    no_of_times_ordered:Number,
    item_name:String,
    item_tag:String,
    item_category:String,
    item_illustrations:[String],
    item_stock:Number,   //0 available 1 last 5 items 2 not available
    item_quantity_ordered:{type:Number,default:0},
    item_discount_price:Number,
    item_price:Number,
    item_img:String,
    no_of_likes:{type:Number,default:0}
},{ versionKey: false });

module.exports = mongoose.model('items',ItemSchema);

foodtruck.js

var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var Items = require('./items.js');


var FoodTruckSchema = new Schema({
    foodtruck_name:String,
    foodtruck_location:String,
    foodtruck_rating:{type:Number,default:5},
    foodtruck_total_votes:{type:Number,default:0},
    foodtruck_tag:String,
    foodtruck_open_status:{type:Number,default:1},   //0 open 1 closed
    foodtruck_starting_timing:String,
    foodtruck_closing_timing:String,
    foodtruck_cusine:String,
    foodtruck_img:String,
    foodtruck_logo:String,
    item_list: [ {type : mongoose.Schema.ObjectId, ref : 'items'}]
},{ versionKey: false });



module.exports = mongoose.model('foodtruck',FoodTruckSchema);

我的查询如下:

var addItem = function(req, res) {
    var foodtruck_id = req.body.foodtruck_id;
    var newItem = new item();
    var itemList = [];
    newItem.item_name = req.body.item_name;
    newItem.item_tag = req.body.item_tag;
    newItem.item_category = req.body.item_category;

    for (var key in req.body) {
        if (req.body.hasOwnProperty(key)) {
            if (key == 'item_illustrations') {
                newItem.item_illustrations = req.body[key];
            }
        }
    }
    newItem.item_stock = req.body.item_status;
    newItem.item_price = req.body.item_price;

    if ((foodtruck_id) && (foodtruck_id.trim() != '')) {
        foodtruck.findById(foodtruck_id.trim(), function(err, foodtrucks) {
            if (err)
                res.json({
                    status: '500',
                    message: 'There is no data available'
                });

            newItem.save(function(err, savedItem) {
                if (!err) {
                   foodtrucks.item_list.push(savedItem._id);
                   foodtrucks.save();
                    foodtruck.find({
                        _id: foodtruck_id.trim()
                    }).populate('item_list').exec(function(err, foodtrucks) {
                        res.json({
                            status: '200',
                            message: 'New item added successfully',
                            data: foodtrucks
                        });
                    });
                } else {
                    res.json({
                        status: '500',
                        message: 'Error while saving new item'
                    });
                }
            });


        });

    }

}

我面临的主要问题是,我能够创建新项目,添加对foodtruck模式的引用,但不知何故,当我为同一foodtruck设置populate查询时,新创建的项目不会显示。那么,你能告诉我我是如何通过填充查询显示这个项目的吗?

1 个答案:

答案 0 :(得分:1)

我认为你必须将populate放在save函数中,以便在save之后使populate方法发生。

foodtrucks.save(function(err, doc) {
    //do population here
});

使用异步方法。