Menu
CoddyTech

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');                            // false

findOne memberikan dokumen pertama yang cocok, atau null jika tidak ada yang cocok.

challenge icon

Tantangan

Mudah

Langkah 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.

  1. Di server.js, tambahkan route GET /books/:id.
  2. 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.
  3. 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" }.
  4. Jika tidak ada buku dengan _id tersebut, kirim respons dengan status 404 dan error, misalnya { "error": "No such book" }. Coba: Kirim GET /books dan salin _id Dune: 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”. Kirim GET /books/ diikuti id yang kamu salin: kamu akan mendapat respons 200 dan data Dune. Kirim GET /books/42: kamu akan mendapat respons 400. Kirim GET /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');
});
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Database dengan MongoDB

Latihan sendiri: Playground Express