pekkav
pekkav

Reputation: 133

Add document to an embedded document array

I'm trying to add an embedded document to an existing document field. I found one fitting answer with the search but I'm running into errors. I'm using node.js, Express and Mongoose.

My database schemas:

var entry = new Schema({
    name        : { type : String, required : true},
    description : { type : String, default: ""},
});

var compo = new Schema({
    name        : String,
    description : String,
    entries     : [entry]
});

And I'm trying to update the entries array with the following code

var entry = new entryModel();
entry.name = "new name";
entry.description= "new description";

compoModel.findOne(query, function (err, item) {
  if (item) {
    item.entries.push(entry);
    item.save(function (err) {
      if (!err) {
        log.debug('Entry added successfully.');
      } else {
        log.error("Mongoose couldn't save entry: " + err);
      }
    });
  }
});

It yields an error: TypeError: Object.keys called on non-object

What have I missed?

Upvotes: 1

Views: 2102

Answers (2)

Hannes
Hannes

Reputation: 1971

My similar issue (same error) was solved by clearing the sub-document array. It was populated prior to the definition of the sub-document scheme. At least this is what i think happened.

E.g.:

var token = new Schema( { value: String, expires: Date } )
var user = new Schema( { username: String, tokens: [token] } )

.. and, prior to defining the 'token' scheme i had entries such as:

{ username: 'foo', tokens: ['123456'] }

.. so, clearing tokens did it for me.

user.tokens = []
user.save()

Upvotes: 1

pekkav
pekkav

Reputation: 133

So I managed to get it working via the Model.update method by simply adding a new object to the compo.entries list and calling compoModel.update.

Upvotes: 1

Related Questions