Filtros de consulta
Parte de la sección Bases de datos con MongoDB del Journey de Node.js de Coddy. Lección 4 de 18.
Un cliente suele querer solo algunos libros, y la base de datos puede seleccionarlos.
El objeto que pasas a find es un filtro: un documento coincide cuando coincide cada campo del filtro. Un valor simple significa igualdad. Un operador es una clave que empieza por $ y realiza una comparación: $gte significa mayor o igual que, $lte menor o igual que.
// pedidos pagados de 20 o más
await orders.find({ status: 'paid', total: { $gte: 20 } }).toArray();Los tipos importan: { $gte: '20' } compara una cadena, y MongoDB nunca compara una cadena con un campo numérico. Todo lo que hay en req.query es una cadena, así que convierte los números en valores numéricos con Number() antes de incluirlos en un filtro.
Desafío
FácilGET /books filtra según sus parámetros de consulta:
?author=conserva los libros de ese autor.?from=y?to=conservan los libros publicados en esos años, incluidos ambos extremos. Cualquiera de los dos puede usarse por separado.- Sin parámetros de consulta, se enumeran todos los libros.
Envía GET /books?from=1960&to=1980 y después GET /books?from=1970.
Pruébalo tú mismo
import express from 'express';
import { MongoClient, ObjectId } from 'mongodb';
const client = new MongoClient('mongodb://localhost:27017');
const db = client.db('shelf');
const books = db.collection('books');
await books.insertMany([
{ title: 'Dune', author: 'Frank Herbert', year: 1965, isbn: '9780441013593', genre: 'scifi' },
{ title: 'Kindred', author: 'Octavia E. Butler', year: 1979, isbn: '9780807083697', genre: 'scifi' },
{ title: 'Emma', author: 'Jane Austen', year: 1815, isbn: '9780141439587', genre: 'classic' },
]);
const app = express();
app.use(express.json());
// Cada error responde con { error: message }.
function sendError(res, status, message) {
res.status(status).json({ error: message });
}
app.get('/', (req, res) => {
res.send('Bookshelf API');
});
app.get('/books', async (req, res) => {
const list = await books.find().toArray();
res.json(list);
});
app.post('/books', async (req, res) => {
const book = req.body;
await books.insertOne(book);
res.status(201).json(book);
});
app.get('/books/:id', async (req, res) => {
if (!ObjectId.isValid(req.params.id)) {
return sendError(res, 400, 'Not a valid id');
}
const book = await books.findOne({ _id: new ObjectId(req.params.id) });
if (!book) {
return sendError(res, 404, 'No such book');
}
res.json(book);
});
app.listen(3000, () => {
console.log('Bookshelf is running on port 3000');
});
Todas las lecciones de Bases de datos con MongoDB
1Documentos
Conexión a MongoDBInserción de documentos2Modificación de documentos
Actualización de documentosOperadores de actualización