Menu
CoddyTech

Filter Query

Termasuk bagian Database dengan MongoDB dalam perjalanan Node.js di Coddy. Pelajaran 9 dari 29.

client sering hanya menginginkan beberapa buku, dan database bisa memilihkannya.

object yang kamu berikan ke find adalah filter: sebuah dokumen cocok jika setiap field dalam filter cocok. Nilai biasa berarti sama dengan. Operator adalah kata kunci yang diawali $ dan melakukan perbandingan: $gte berarti lebih besar dari atau sama dengan, $lte berarti lebih kecil dari atau sama dengan. Dua operator pada field yang sama menggunakan satu object: { total: { $gte: 20, $lte: 50 } } menyisakan total dari 20 sampai 50.

// pesanan berstatus paid dengan total 20 atau lebih
await orders.find({ status: 'paid', total: { $gte: 20 } }).toArray();

Tipe data juga berpengaruh: { $gte: '20' } membandingkan string, dan MongoDB tidak pernah mencocokkan string dengan field bertipe angka. Semua yang ada di req.query berupa string, jadi ubah angka menjadi angka dengan Number() sebelum memasukkannya ke filter.

challenge icon

Tantangan

Mudah

Langkah ini membuka proyek API rak buku yang telah disiapkan untuk kursus, bukan file proyekmu dari Mencari berdasarkan ObjectId (termasuk server.js). Pekerjaanmu sebelumnya tetap berada di pelajarannya sendiri. Baca file yang disediakan sebelum mengedit server.js. Salinan ini berisi rute penambahan buku ke rak dan pencarian ObjectId.

Client hanya menginginkan beberapa buku: buku dari satu penulis, atau buku dari tahun tertentu. Biarkan database memilihnya.

  1. Di server.js, ubah GET /books. Buat object filter dari query string dan berikan ke find. Rute ini tetap merespons dengan array JSON berisi buku.
  2. ?author=Jane%20Austen mengembalikan hanya buku yang author-nya tepat Jane Austen. (%20 adalah cara URL menuliskan spasi.)
  3. ?from=1960 mengembalikan buku dengan year 1960 atau lebih baru. ?to=1980 mengembalikan buku dari tahun 1980 atau lebih awal. Jika keduanya digunakan, tahun buku harus berada di antara kedua tahun tersebut, dan kedua tahun itu juga dihitung. Salah satunya bisa digunakan sendiri.
  4. Nilai query selalu diterima sebagai string, tetapi tahun yang tersimpan berupa angka. Ubah from dan to menjadi angka sebelum dimasukkan ke filter, atau tidak ada yang cocok.
  5. Tanpa query, rute ini mengembalikan semua buku seperti sebelumnya. Coba: Kirim GET /books?from=1960&to=1980: kamu mendapatkan Dune (1965) dan Kindred (1979). Kirim GET /books?from=1970: kamu hanya mendapatkan Kindred. Kirim GET /books?to=1900: kamu hanya mendapatkan Emma (1815). Kirim GET /books?author=Jane%20Austen: kamu hanya mendapatkan Emma. Kirim GET /books: kamu mendapatkan ketiganya.

Coba sendiri

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());

// Setiap error menghasilkan 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.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');
});

Semua pelajaran di Database dengan MongoDB

Latihan sendiri: Playground Express