Ricerca tramite ObjectId
Fa parte della sezione Database con MongoDB del percorso Node.js di Coddy. Lezione 3 di 18.
Per recuperare un libro, il server lo cerca tramite _id, ma l’id arriva nell’URL come testo.
Un _id creato da MongoDB è un ObjectId: un valore di 12 byte scritto come 24 caratteri esadecimali. JSON lo mostra come una stringa, ma nel database non lo è, quindi un filtro con il testo semplice non trova nulla. Prima converti il testo in un ObjectId. ObjectId.isValid indica se un testo può essere convertito, perché new ObjectId genera un errore con qualsiasi altro valore.
import { ObjectId } from 'mongodb';
const text = '66f1c2a9e4b0a1b2c3d4e5f6';
await orders.findOne({ _id: new ObjectId(text) }); // l'ordine, oppure null
await orders.findOne({ _id: text }); // null: text non è un ObjectId
ObjectId.isValid('42'); // falsefindOne restituisce il primo documento corrispondente, oppure null se non ce ne sono.
Sfida
FacileGET /books/:idrestituisce il libro con quell’_id.- Un id che non può essere un ObjectId restituisce
400. - Un id valido senza un libro corrispondente restituisce
404.
Copia un _id da GET /books e invia GET /books/<id>. Poi invia GET /books/42.
Provalo tu
import express from 'express';
import { MongoClient } 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());
// Ogni errore restituisce { 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.listen(3000, () => {
console.log('Bookshelf is running on port 3000');
});
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Database con MongoDB
1Documenti
Connessione a MongoDBInserimento di documenti