Обработка ошибок запросов
В этом шаге вы научитесь обрабатывать различные ошибки запросов в MongoDB, понимая общие ловушки и реализуя надежные стратегии обработки ошибок для запросов к базе данных.
Понимание ошибок запросов в MongoDB
Давайте изучим различные типы ошибок запросов и способы их эффективного управления с использованием MongoDB shell (mongosh).
Сначала убедитесь, что вы подключены к MongoDB shell:
mongosh
Подготовка образцовых данных
Создайте образцовую коллекцию для демонстрации ошибок запросов:
use querylab
db.products.insertMany([
{ name: "Laptop", price: 1000, category: "Electronics" },
{ name: "Smartphone", price: 500, category: "Electronics" },
{ name: "Headphones", price: 200, category: "Accessories" }
])
Типы ошибок запросов
1. Неверный синтаксис запроса
Продемонстрируйте общую ошибку синтаксиса запроса:
// Неверный оператор сравнения
db.products.find({ price: { $invalidOperator: 500 } })
Пример вывода:
MongoError: unknown top level operator: $invalidOperator
2. Запрос по несуществующему полю
Попробуйте выполнить запрос по несуществующему полю:
// Запрос по полю, которое не существует
db.products.find({ nonexistentField: "value" })
Это не вызовет ошибку, но вернет пустой набор результатов.
3. Несоответствие типов в запросах
Продемонстрируйте проблемы, связанные с типами запросов:
// Запрос с несоответствием типов
db.products.find({ price: "500" }) // Строка вместо числа
Расширенная обработка ошибок запросов
Создайте скрипт на Node.js, чтобы продемонстрировать надежную обработку ошибок запросов:
const { MongoClient } = require("mongodb");
async function handleQueryErrors() {
const uri = "mongodb://localhost:27017";
const client = new MongoClient(uri);
try {
await client.connect();
const database = client.db("querylab");
const products = database.collection("products");
try {
// Безопасный запрос с обработкой ошибок
const query = { price: { $gt: 0 } };
const options = {
projection: { _id: 0, name: 1, price: 1 },
limit: 10
};
const cursor = products.find(query, options);
const results = await cursor.toArray();
if (results.length === 0) {
console.log("No matching documents found");
} else {
console.log("Query results:", results);
}
} catch (queryError) {
// Специфическая обработка ошибок
if (queryError.name === "MongoError") {
console.error("MongoDB Query Error:", queryError.message);
} else {
console.error("Unexpected error:", queryError);
}
}
} catch (connectionError) {
console.error("Connection error:", connectionError);
} finally {
await client.close();
}
}
handleQueryErrors();
Лучшие практики по обработке ошибок запросов
- Всегда проверяйте входные данные перед выполнением запроса
- Используйте блоки try-catch для управления ошибками
- Реализуйте проверку типов
- Используйте проекцию для контроля возвращаемых полей
- Добавьте соответствующую запись ошибок
- Г gracefully обработайте пустые наборы результатов