Добавить документ во встроенный массив документов - PullRequest
1 голос
/ 29 марта 2012

Я пытаюсь добавить внедренный документ в существующее поле документа.Я нашел один подходящий ответ с поиском, но я сталкиваюсь с ошибками.Я использую node.js, Express и Mongoose.

Мои схемы базы данных:

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

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

И я пытаюсь обновить массив записей следующим кодом

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

выдает ошибку: TypeError: Object.keys called on non-object

Что я пропустил?

Ответы [ 2 ]

1 голос
/ 17 апреля 2013

Моя похожая проблема (та же ошибка) была решена путем очистки массива вложенных документов. Он был заполнен до определения схемы субдокументов. По крайней мере, я так и думал.

например:.

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

.. и до определения схемы «токен» у меня были такие записи, как:

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

.. итак, очищающие токены сделали это для меня.

user.tokens = []
user.save()
1 голос
/ 02 апреля 2012

Мне удалось заставить его работать с помощью метода Model.update, просто добавив новый объект в список compo.entries и вызвав compoModel.update.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...