Как я могу обновить несколько полей в массиве вложенных документов Mongoose? - PullRequest
0 голосов
/ 09 октября 2019

Моя модель Mongoose:

const userSchema = Schema({
  firstName: String,
  lastName: String,
  books: [{title: String, author: String, isbn: Number}]
});

Я хотел бы добавить a new title & author with a book object для каждого запроса POST. Мой текущий подход дает мне ошибку positional operator did not find the match:

var User = mongoose.model("User", userSchema);
router.post('/submit', (req, res) => {    
    let update={
              'books.$.title' : req.body.title,
              'books.$.author' : req.body.author
               }
    User.findOneAndUpdate({_id:req.body.user_id},{$push: update},{new: true}).exec(function(err, doc) {
      if (err){
        console.log(err);
        return;
      }
     res.send(doc);
    });
});

Я ожидаю следующий результат для отправки двух форм (POST) с другим автором и названием в моей БД:

{
  _id: 'SomeId'
  firstName: 'John',
  lastName: 'Cena',
  books: [{title: 'a', author:'b' }, {{title: 'c', author:'d' }}]
}

Iв обоих сообщениях насчет ISBN не имеет значения, поскольку в нашей схеме это поле не является обязательным. Поскольку мой поддокумент books в начале пуст, поэтому я не могу правильно установить positional operator ($) в своем коде. Пожалуйста, помогите мне правильно написать findOneAndUpdate запрос!

1 Ответ

1 голос
/ 09 октября 2019

$push требует имя и значение поля, в вашем случае имя поля - book, а значение - объект {author, title}

User.findOneAndUpdate({_id:req.user._id}, {$push : { books : { author: "c", title: "d"}}})
...