Filter Query
Termasuk bagian Database dengan MongoDB dalam perjalanan Node.js di Coddy. Pelajaran 4 dari 18.
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 key yang diawali dengan $ dan membandingkan nilai dengan cara lain: $gte berarti lebih besar dari atau sama dengan, $lte berarti lebih kecil dari atau sama dengan.
// pesanan yang sudah dibayar 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 angka. Semua yang ada di req.query berupa string, jadi ubah angka menjadi angka dengan Number() sebelum memasukkannya ke filter.
Tantangan
MudahGET /books memfilter berdasarkan query-nya:
?author=menyertakan buku karya penulis tersebut.?from=dan?to=menyertakan buku yang diterbitkan pada tahun-tahun tersebut, termasuk kedua batasnya. Salah satunya dapat digunakan sendiri.- Tanpa query, semua buku akan ditampilkan.
Kirim GET /books?from=1960&to=1980, lalu GET /books?from=1970.
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 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.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