const mongoose = require('mongoose');
mongoose.connect("mongodb://localhost:27017/mongo-exercise")
.then( ()=> console.log("Подключено к MongoDB..."))
.catch(err => console.error("Не удалось подключиться к базе данных...",err));
Ниже приведена схема и модель курса
const courseSchema = new mongoose.Schema({
name:String,
author:String,
tags:[String],
date:Date,
isPublished: Boolean,
price:Number
});
const Course = mongoose.model('Course',courseSchema);
Вот функция для получения списка курсов на основе определенных критериев.
async function getCourses() {
return await Course
.find({isPublished:true})
.or([
{price : {$gte: 15}},
{name : /.*by.*/}
])
.sort('-price')
.select('name author price')
};
Вот функция для обновления автора курса определенного курса по его идентификатору, но она не срабатывает и выводит, что курс не найден.
async function updateCourse(id) {
const mongoose = require('mongoose');
console.log('Проверка..');
if (!mongoose.Types.ObjectId.isValid(id)) {
console.log('Некорректный формат ID');
return;
}
try {
const course = await Course.findById(id);
if (!course) {
console.log('Курс не найден');
return;
}
course.isPublished = false;
course.author="Manish";
const result = await course.save();
console.log(result);
} catch (error) {
console.error('Ошибка при обновлении курса:', error);
}
}
ID курса, который я пытаюсь обновить, совпадает с другими ID, существующими в базе данных, но это не работает. Но при запросе к базе данных тот же ID появляется.
async function run() {
const courses = await getCourses();
console.log("Список курсов \n" ,courses);
}
updateCourse('5a68fdd7bee8ea64649c2777');
Вот вывод запроса к базе данных
Список курсов
[
{
_id: new ObjectId('5a68fdd7bee8ea64649c2777'),
name: 'Курс Node.js',
author: 'Mosh',
price: 20
},
{
_id: new ObjectId('5a6900fff467be65019a9001'),
name: 'Курс Angular',
author: 'Mosh',
price: 15
},
{
_id: new ObjectId('5a68fde3f09ad7646ddec17e'),
name: 'Курс ASP.NET MVC',
author: 'Mosh',
price: 15
},
{
_id: new ObjectId('5a68fe2142ae6a6482c4c9cb'),
name: 'Курс Node.js от Джека',
author: 'Jack',
price: 12
}
]
А вот и вывод обновления
Проверка..
Подключено к MongoDB…
Курс не найден
Я пробовал это решение, чтобы найти курс по его названию, и оно работает.
async function testQuery() {
const course = await Course.findOne({ name: 'Курс React' });
console.log('Курс найден по имени:', course);
}
debugQuery();
Какова может быть причина того, что курс не обновляется, или есть ли что-то неправильное в моем подходе?
Ответ
Проблема, с которой вы сталкиваетесь, когда не можете обновить курс по его идентификатору (ID), может быть вызвана несколькими факторами. Давайте разберемся в вашем коде и найдем источник проблемы.
Возможные причины проблемы:
-
Неправильный формат ID: Убедитесь, что идентификатор, который вы передаете в функцию
updateCourse
, имеет правильный формат. Вы уже используетеmongoose.Types.ObjectId.isValid(id)
, что является хорошей проверкой. -
Неинициализированная база данных: Возможно, база данных не инициализировалась должным образом. Убедитесь, что ваша база данных работает, и вы можете делать запросы без ошибок.
-
Асинхронное выполнение: Поскольку
updateCourse
вызывается после других асинхронных вызовов, убедитесь, что база данных успела загрузить данные перед тем, как вы вызываете функцию обновления. - Проблема с объектом модели: Вы ищете курс по ID, но, возможно, объект курса был изменен или был использован другой экземпляр. Важно убедиться, что вы извлекаете курс по корректному ID.
Решение проблемы:
Вот улучшенная версия вашего кода, которая учитывает указанные выше причины:
const mongoose = require('mongoose');
mongoose.connect("mongodb://localhost:27017/mongo-exercise", { useNewUrlParser: true, useUnifiedTopology: true })
.then(() => console.log("Connected to MongoDB..."))
.catch(err => console.error("Failed to connect to db...", err));
const courseSchema = new mongoose.Schema({
name: String,
author: String,
tags: [String],
date: Date,
isPublished: Boolean,
price: Number
});
const Course = mongoose.model('Course', courseSchema);
async function getCourses() {
return await Course
.find({ isPublished: true })
.or([
{ price: { $gte: 15 } },
{ name: /.*by.*/ }
])
.sort('-price')
.select('name author price');
}
async function updateCourse(id) {
console.log('Checking...');
if (!mongoose.Types.ObjectId.isValid(id)) {
console.log('Invalid ID format');
return;
}
try {
const course = await Course.findById(id);
if (!course) {
console.log('Course not found');
return;
}
course.isPublished = false;
course.author = "Manish";
const result = await course.save();
console.log('Updated course:', result);
} catch (error) {
console.error('Error updating the course:', error);
}
}
async function run() {
const courses = await getCourses();
console.log("List of courses:\n", courses);
// Обратите внимание на правильный ID
await updateCourse('5a68fdd7bee8ea64649c2777');
}
run();
Проверьте следующее:
- Убедитесь, что вы вызываете
updateCourse
после выполнения всех асинхронных операций и подключения к базе данных. - Проверьте, соответствует ли ID запрашиваемого курса ожидаемому ID в базе данных.
- Убедитесь, что никаких дополнительных вызовов
updateCourse
не происходит одновременно с вашей функциейrun
.
Если проблема все еще не решается, рассмотрите возможность отладки с помощью console.log
для проверки значений, которые вы передаете и получаете, и дополнительная информация о том, что происходит в процессе выполнения.