Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Adding child document to existing mongodb document

Essentially I am just trying to add a new sub-document to my existing mongodb document that has the following schema

/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 route to post to adventures

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

When I take the adventure out of the destination.adventures.push() the code does not break, but when I insert adventures I get an error

/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)
like image 595
pwborodich Avatar asked Sep 24 '15 03:09

pwborodich


People also ask

When should we embed one document within another in MongoDB?

An embedded, or nested, MongoDB Document is a normal document that's nested inside another document within a MongoDB collection. Embedded documents are particularly useful when a one-to-many relationship exists between documents.

What is a subdocument in MongoDB?

Subdocuments are documents embedded in other documents. In Mongoose, this means you can nest schemas in other schemas. Mongoose has two distinct notions of subdocuments: arrays of subdocuments and single nested subdocuments.


1 Answers

The error you are getting is as a result of embedding the Adventure model instead of the schema. You need to add the Adventure schema in the destination schema definition the Adventure model's schema property:

// 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]
});
like image 117
chridam Avatar answered Oct 10 '22 09:10

chridam