将子文档添加到现有的mongodb文档

时间:2015-09-24 03:36:14

标签: mongodb mongoose mean-stack addchild mongoose-schema

基本上我只是想在我现有的具有以下架构的mongodb文档中添加一个新的子文档

/models/server/destination.js

// this is the "destination" model for mongoose
var mongoose = require('mongoose')
var Adventure = require('../models/adventure')

// this is the schema that every entry will get when a new trip is made.
var tripSchema = mongoose.Schema({
    name: { type: String, required: true },
    city: { type: String, required: true },
    dateStart: { type: Date, required: true },
    dateFinish: { type: Date, required: true },
    adventures: [Adventure]
})

// module.exports makes this model available to other file 
module.exports = mongoose.model('Destination', tripSchema)

/server/models/adventure.js

var mongoose = require('mongoose')

var adventure = mongoose.Schema({
    site: String,
    rating: String,
    photo: String,
    website: String,
    date: Date
})

module.exports = mongoose.model('Adventure', adventure)

发布到冒险的REST路线

app.post('/api/destinations/:id/addAdventures', destinationsController.addAdventures)

/server/controllers/controller.js

module.exports.addAdventures = function(req, res) {
    var id = req.params.id;
    Destination.findOne({ _id: id }, function(err, result) {
        var adventure = new Adventure(req.body)
        var destination = result
        destination.adventures.push(adventure)
        destination.save(function(err, advresult) {
            console.log('push worked')
            res.json(advresult);
        })
    })
}

当我从destination.adventures.push()中取出冒险时,代码不会中断,但当我插入冒险时,我会收到错误

/Travellog/node_modules/mongoose/lib/types/array.js:117
    return this._schema.caster.cast(value, this._parent, false);
                               ^ TypeError: undefined is not a function
    at Array.MongooseArray.mixin._cast (/Travellog/node_modules/mongoose/lib/types/array.js:117:32)
    at Array.MongooseArray.mixin._mapCast (/Travellog/node_modules/mongoose/lib/types/array.js:286:17)
    at Object.map (native)
    at Array.MongooseArray.mixin.push (/Travellog/node_modules/mongoose/lib/types/array.js:299:25)
    at Query.<anonymous> (/Travellog/server/controllers/destinations-controller.js:28:28)
    at /Travellog/node_modules/mongoose/node_modules/kareem/index.js:177:19
    at /Travellog/node_modules/mongoose/node_modules/kareem/index.js:109:16
    at process._tickCallback (node.js:355:11)

1 个答案:

答案 0 :(得分:29)

您获得的错误是嵌入Adventure模型而非模式的结果。您需要在目标模式定义中添加Adventure模式Adventure模型的模式属性:

// this is the "destination" model for mongoose
var mongoose = require('mongoose');
var AdventureSchema = require('../models/adventure').schema; /* <- access the schema via its Model.schema property */

var tripSchema = mongoose.Schema({
    name: { type: String, required: true },
    city: { type: String, required: true },
    dateStart: { type: Date, required: true },
    dateFinish: { type: Date, required: true },
    adventures: [AdventureSchema]
});
相关问题