【问题标题】:Add item with reference in other collection fails在其他集合中添加带有引用的项目失败
【发布时间】:2017-03-13 20:31:57
【问题描述】:

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

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_price:Number,
    item_img:String,
    no_of_likes:{type:Number,default:0}
},{ versionKey: false });

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

不,我想添加新项目。新项目已添加,但不知何故,它的引用并未传送到 foodtruck.item_list。我正在尝试的查询如下:

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();
            foodtrucks.item_list.push(newItem);
            foodtrucks.save();
            console.log(foodtrucks);

            foodtruck.findById(foodtruck_id.trim()).populate('item_list').exec(function(err, foodtrucks) {
                if (err) res.json({
                    status: '500',
                    message: 'There is no data available'
                });
                res.send({
                    status: '200',
                    message: 'Review List',
                    data: foodtrucks
                });
            });
        });
    } else {
        res.json({
            status: '404',
            message: 'Please enter valid foodtruck id'
        });
    }

};

在这里,添加了项目,但 foodtruck 没有它的引用。那么,如何添加item的引用呢?

foodtruck 集合中新增项目的屏幕截图

【问题讨论】:

  • 为什么不在 foodtruck.save() 中传递回调并查看它是否被保存,如果没有,那么错误是什么
  • 甚至,我尝试过这样做。没有错误。只是“item_list”中没有引用
  • 你在什么时候卡住了?
  • 基本上,我想做的是,当为特定的食品卡车添加新项目时,它的引用也应该添加到食品卡车集合中。
  • 新项目创建成功了吗?另外,newItem.item_illustrations = req.body[key]; -> 这是正确的吗?

标签: node.js mongoose mongoose-schema


【解决方案1】:

您推送的是整个项目,而不是新创建项目的 ObjectId。您需要保存新项目,然后在保存的回调中,您必须在item_list 中推送新创建项目的_id

而不是简单的保存试试这个:

//do everything inside the calllback of the save
newItem.save(function(err,savedItem){
    if(!err){
        foodtrucks.item_list.push(savedItem._id);
        foodtrucks.save();//youcan use callback here also to handle the errors
        console.log(foodtrucks);

        foodtruck.findById(foodtruck_id.trim()).populate('item_list').exec(function(err, foodtrucks) {
            if (err) res.json({
                status: '500',
                message: 'There is no data available'
            });
            res.send({
                status: '200',
                message: 'Review List',
                data: foodtrucks
            });
        });
    }else{
        res.json({
            status: '500',
            message: 'Error while saving new item'
        });
    }
});

【讨论】:

  • 当我通过 robomongo 检查时,项目在 foodtruck 集合中被引用。但不知何故,当我提出填充查询时,新添加的项目并未反映在输出 json 响应中
  • 你试过我的方法了吗?
  • 是的,我尝试了你的方法,当我通过 robomongo 检查时,项目在 foodtruck 集合中被引用。但不知何故,当我提出填充查询时,新添加的项目并未反映在输出 json 响应中
  • 你能告诉我它是如何存储在robomongo中的,新推送的和旧的item objectIds有区别吗?
  • 我在更新的问题中添加了查询的“foodtruck”集合的图像。它来自 robomongo
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-01
  • 2016-08-14
  • 2015-10-15
相关资源
最近更新 更多