Tam2
Tam2

Reputation: 1367

mongoose save embedded document

I have the following schema:

var StorySchema = new Schema({
  title:        { type: String, required: true },
  users:        { 
                  id:        { type: Schema.ObjectId, ref: 'Users' },
                  creator:   { type: Boolean } 
                },       
  maxlines:     { type: Number, default: '10'},
  lines:        {
                  text:       { type: String },
                  entered_at: { type: Date }, 
                  user:       {
                                id:   { type: Schema.ObjectId, ref: 'Users' }
                              }
                },
  created_date: { type: Date, default: Date.now }, 
  updated_date: { type: Date, default: Date.now },        
})

I want to push data into lines and am trying to do so with the below update:

 exports.update = function (req, res) {
    Stories
    .findOne({ _id: req.params.id }, function (err, story) {
            if (err) {
                res.json(200, {
                    success: "false",
                    message: err.message
                })
            } else {    
        story.maxlines = story.maxlines - 1
        story.lines.push ({
            text : req.body.text,
            'user.id' : req.headers.id,
            entered_at : new Date().toISOString()
        })
        story.save(function(err, story) {
              if (err) {
                res.json(200, {
                    success: "false",
                    message: err.message
                })
            } else if (story) {
                res.json({
                    sucess: "true",
                    message: story
                })
            }
        })
        }

    })

 }

I get an error of TypeError: Object { user: {} } has no method 'push', not entirely sure how to update the lines and the user associated with the line

Upvotes: 1

Views: 2800

Answers (1)

zs2020
zs2020

Reputation: 54543

Because story.lines is not an Array. You probably need to update the Schema to convert the lines to type Array in this way:

var LineSchema = new Schema({
    text: {
        type: String
    },
    entered_at: {
        type: Date
    },
    user: {
        id: {
            type: Schema.ObjectId,
            ref: 'Users'
        }
    }
});

var StorySchema = new Schema({
    title: {
        type: String,
        required: true
    },
    users: {
        id: {
            type: Schema.ObjectId,
            ref: 'Users'
        },
        creator: {
            type: Boolean
        }
    },
    maxlines: {
        type: Number,
        default: '10'
    },
    lines: [LineSchema],
    created_date: {
        type: Date,
        default: Date.now
    },
    updated_date: {
        type: Date,
        default: Date.now
    },
})

Upvotes: 1

Related Questions