Mongoose Model.update не работает в моем коде - PullRequest
0 голосов
/ 09 сентября 2018

Я хочу обновить некоторые свойства курса с указанным идентификатором. Это мой код:

const mongoose = require('mongoose');
const courseSchema = new mongoose.Schema({
    name: String,
    author: String,
    tags: [String],
    date: Date,
    isPublished: Boolean,
    price: Number
});

const Course = mongoose.model('Course', courseSchema);
mongoose.connect('mongodb://localhost/mongo-exercises');

async function updateCourse(id) {
     const result = await Course.update({_id: id}, {
        $set: {
            author: 'New', 
            isPublished: false
        }
    });

console.log(result);
}

updateCourse('5a68fde3f09ad7646ddec17e');

На консоли я получаю {ok: 1, nModified: 0, n: 0}.

Я пытался обновить элемент другим способом, но он не работает. Для этого куска кода я не получаю результат, нет ответа:

const course = await Course.findById(id);
  if(!course) return; 

  course.isPublished = true; 
  course.author = 'Another Author';

  const result = await course.save();
  console.log(result);

Когда я пытаюсь выполнить обновление с использованием findByIdAndUpdate с этим другим кодом, в консоли выводится нулевое значение:

 async function updateCourse(id) {
    const course = await Course.findByIdAndUpdate(id, {
    $set: {
        author: 'Billy',
        isPublished: false
    }
 });

   console.log(course);

 }
updateCourse('5a68fde3f09ad7646ddec17e');

База данных, с которой я работаю, имеет:

 { _id: 5a68fdd7bee8ea64649c2777,
   name: 'Node.js Course',
   author: 'Sam',
   isPublished: true,
   price: 20 },
 { _id: 5a68fde3f09ad7646ddec17e,
   name: 'ASP.NET MVC Course',
   author: 'Mosh',
   isPublished: true,
   price: 15 },
 { _id: 5a6900fff467be65019a9001,
   name: 'Angular Course',
   author: 'Mosh',
   isPublished: true,
   price: 15 },
 { _id: 5a68fe2142ae6a6482c4c9cb,
   name: 'Node.js Course by Jack',
   author: 'Jack',
   isPublished: true,
   price: 12 }

Курс не обновляется. Где ошибка? Обратите внимание, что если я хочу создать новые документы, он делает это без проблем.

Ответы [ 5 ]

0 голосов
/ 11 апреля 2019

добавить _id:String в вашу схему

const courseSchema=new mongoose.Schema({
  name:String,
  _id:String,
  author:String,
  tags: [String],
  date: Date,
  isPublished: Boolean,
  price: Number
});

И замените свое обещание следующим:

async function updateCourse(id) {
  const result = await Course.update({ _id: mongoose.Types.ObjectId(id) }, { 
    $set: { author: 'New Author', isPublished: false }
  });

Я столкнулся с той же проблемой в курсе mosh node.js, и это решение помогло мне! :)

0 голосов
/ 27 февраля 2019

update ({_ id: id}, ...) указывает _id, ожидающий тип _id в документе как ObjectID.

update () и findById () не находят _id и возвращают ноль, поскольку тип _id, вероятно, является строкой в ​​вашей коллекции / документе, - проверьте с помощью Compass.

0 голосов
/ 09 сентября 2018

Попробуйте использовать

isPublished: {
    type: Boolean,
    default: false
}

вместо

isPublished: Boolean
0 голосов
/ 09 сентября 2018

Возвращаемое значение {ok: 1, nModified: 0, n: 0} говорит о том, что операция прошла успешно, но не может найти или обновить какую-либо запись, так что это означает, что она даже не совпадает.

Я не совсем уверен, но я думаю, что Мангуста находит идентификатор только по ObjectId, а не по string.

Таким образом, вы должны получить желаемый результат, конвертировав его так:

const result = await Course.update({ _id: mongoose.Types.ObjectId(id) }, { 
    $set: { author: 'New', isPublished: false }
});
0 голосов
/ 09 сентября 2018

Я не вижу проблем в коде, и здесь запрос и синтаксис являются правильными, в соответствии с документом MongoDB update .

Метод update () возвращает объект WriteResult, который содержит состояние операции. В случае успеха объект WriteResult содержит количество документов, соответствующих условию запроса, количество документов, вставленных обновлением, и количество документов модифицировано.

Здесь документы не были изменены, и единственная причина в том, что вы задаете те же данные для обновления в запросе.

...