Menemukan Dokumen berdasarkan ObjectId
Termasuk bagian Database dengan MongoDB dalam perjalanan Node.js di Coddy. Pelajaran 7 dari 29.
Untuk menjawab permintaan tentang satu buku, server mencarinya berdasarkan _id, tetapi id diterima sebagai teks di URL.
_id yang dibuat MongoDB adalah ObjectId: nilai 12 byte yang ditulis sebagai 24 karakter heksadesimal, yaitu digit 0 sampai 9 dan huruf a sampai f. JSON menampilkannya sebagai string, tetapi di database nilainya bukan string, jadi penyaring dengan teks biasa tidak cocok dengan apa pun. Ubah teks itu menjadi ObjectId terlebih dahulu. ObjectId.isValid menunjukkan apakah teks dapat menjadi ObjectId, karena new ObjectId akan memunculkan error jika teksnya tidak valid.
import { ObjectId } from 'mongodb';
const text = '66f1c2a9e4b0a1b2c3d4e5f6';
await orders.findOne({ _id: new ObjectId(text) }); // pesanannya, atau null
await orders.findOne({ _id: text }); // null: text bukan ObjectId
ObjectId.isValid('42'); // falsefindOne memberikan dokumen pertama yang cocok, atau null jika tidak ada yang cocok.
Tantangan
MudahLangkah ini membuka proyek API rak buku yang disiapkan untuk kursus, bukan file proyekmu dari Menyisipkan Dokumen (termasuk server.js). Pekerjaanmu sebelumnya tetap berada di pelajarannya sendiri. Baca file yang disediakan sebelum mengedit server.js. Salinan ini berisi daftar buku dan route penyisipan.
Seorang client ingin mengambil satu buku yang dipilih berdasarkan _id.
- Di
server.js, tambahkan routeGET /books/:id. - Id di URL berupa teks. Ada teks yang tidak mungkin menjadi ObjectId, yaitu teks yang bukan 24 karakter berisi angka dan huruf a sampai f. Untuk teks seperti itu, kirim respons dengan status 400 dan error menggunakan
sendError, misalnya{ "error": "Not a valid id" }. Lakukan pemeriksaan ini sebelum membuat ObjectId, karena membuatnya dari teks yang tidak valid akan memunculkan error. - Jika tidak, cari buku berdasarkan
_id-nya. Jika buku ditemukan, kirim respons dengan status 200 dan data bukunya:{ "_id": "6720a1f4c2b9e81d3a5f0c11", "title": "Dune", "author": "Frank Herbert", "year": 1965, "isbn": "9780441013593", "genre": "scifi" }. - Jika tidak ada buku dengan
_idtersebut, kirim respons dengan status 404 dan error, misalnya{ "error": "No such book" }. Coba: KirimGET /booksdan salin_idDune: 24 karakter setelah"_id":. Setiap kali kamu menekan tombol “Jalankan”, buku-buku akan mendapat id baru, jadi salin lagi setelah setiap kali menekan tombol “Jalankan”. KirimGET /books/diikuti id yang kamu salin: kamu akan mendapat respons 200 dan data Dune. KirimGET /books/42: kamu akan mendapat respons 400. KirimGET /books/000000000000000000000000: ini id yang valid, tetapi tidak dimiliki buku mana pun, jadi kamu akan mendapat respons 404.
Coba sendiri
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());
// Setiap error memberikan respons { 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');
});
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Database dengan MongoDB
1Dokumen
Buku sebagai DokumenKoleksi dan DatabaseMenghubungkan ke MongoDBMembaca Dokumen TersimpanMenyisipkan DokumenMenemukan Satu DokumenMenemukan Dokumen berdasarkan ObjectIdMembandingkan AngkaFilter QueryMemilih Field yang DikembalikanMengurutkan Hasil QueryMempertahankan Hasil PertamaProyeksi, Pengurutan, dan BatasLatihan sendiri: Playground Express