Menu
CoddyTech

Mencari berdasarkan ObjectId

Termasuk bagian Database dengan MongoDB dalam perjalanan Node.js di Coddy. Pelajaran 3 dari 18.

Untuk menjawab permintaan satu buku, server mencarinya berdasarkan _id, tetapi id tiba dalam URL sebagai teks.

_id yang dibuat MongoDB adalah ObjectId: nilai 12 byte yang ditulis sebagai 24 karakter heksadesimal. JSON menampilkannya sebagai string, tetapi di database nilainya bukan string, jadi filter dengan teks biasa tidak akan menemukan apa pun. Ubah teks itu menjadi ObjectId terlebih dahulu. ObjectId.isValid menyatakan apakah sebuah teks dapat menjadi ObjectId, karena new ObjectId akan menimbulkan error jika menerima teks lainnya.

import { ObjectId } from 'mongodb';

const text = '66f1c2a9e4b0a1b2c3d4e5f6';
await orders.findOne({ _id: new ObjectId(text) }); // pesanan, 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
  • GET /books/:id mengembalikan buku dengan _id tersebut.
  • ID yang bukan ObjectId akan menghasilkan 400.
  • ID valid yang tidak memiliki buku akan menghasilkan 404.

Salin _id dari GET /books dan kirim GET /books/<id>. Lalu kirim GET /books/42.

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 mengembalikan { 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