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.
Tantangan
MudahLangkah 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.
- Di
server.js, ubahGET /books. Buat object filter dari query string dan berikan kefind. Rute ini tetap merespons dengan array JSON berisi buku. ?author=Jane%20Austenmengembalikan hanya buku yangauthor-nya tepatJane Austen. (%20adalah cara URL menuliskan spasi.)?from=1960mengembalikan buku denganyear1960 atau lebih baru.?to=1980mengembalikan 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.- Nilai query selalu diterima sebagai string, tetapi tahun yang tersimpan berupa angka. Ubah
fromdantomenjadi angka sebelum dimasukkan ke filter, atau tidak ada yang cocok. - Tanpa query, rute ini mengembalikan semua buku seperti sebelumnya. Coba: Kirim
GET /books?from=1960&to=1980: kamu mendapatkan Dune (1965) dan Kindred (1979). KirimGET /books?from=1970: kamu hanya mendapatkan Kindred. KirimGET /books?to=1900: kamu hanya mendapatkan Emma (1815). KirimGET /books?author=Jane%20Austen: kamu hanya mendapatkan Emma. KirimGET /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
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