Proyeksi, Pengurutan, dan Batas
Termasuk bagian Database dengan MongoDB dalam perjalanan Node.js di Coddy. Pelajaran 13 dari 29.
Daftar "buku terbaru" memerlukan beberapa field dari beberapa buku, secara berurutan.
Proyeksi memilih field yang dijawab oleh query: 1 mempertahankan sebuah field, dan _id ikut disertakan kecuali kamu mengaturnya menjadi 0. Pada kursor, sort({ field: -1 }) mengurutkan dari nilai tertinggi ke terendah (1 mengurutkan dari nilai terendah ke tertinggi), dan limit(n) mempertahankan n hasil pertama.
// 5 skor tertinggi, hanya nama dan skor
await players
.find({}, { projection: { name: 1, score: 1, _id: 0 } })
.sort({ score: -1 })
.limit(5)
.toArray();Database mengurutkan sebelum membatasi, apa pun urutan kamu merangkai kedua pemanggilan tersebut. Mengurutkan array di JavaScript setelah limit berarti kamu mengurutkan lima hasil yang salah.
Tantangan
MudahLangkah ini membuka proyek API rak buku kursus yang sudah disiapkan, bukan file proyekmu dari Filter Kueri (termasuk server.js). Pekerjaanmu sebelumnya tetap berada di pelajarannya sendiri. Baca file yang disediakan sebelum mengedit server.js. Salinan ini berisi rute rak buku dan filter rentang tahun.
Halaman beranda menampilkan buku-buku terbaru, hanya dengan judul dan tahunnya.
- Di
server.js, tambahkan ruteGET /books/newest. Letakkan di atasGET /books/:id. Express mencoba rute secara berurutan, dan/books/:idjuga cocok dengan/books/newest. Rute itu akan menganggapnewestsebagai id dan merespons dengan 400. - Rute ini mengembalikan buku yang diurutkan berdasarkan
year, dari yang tertinggi. ?n=menentukan jumlah buku yang dikembalikan. Jikantidak ada, kembalikan 3.- Setiap buku hanya memuat
titledanyear, tanpa_iddan tanpa field lain. Biarkan kueri memilih field, mengurutkan buku, lalu membatasi list. Untuk buku-buku awal,GET /books/newest?n=2mengembalikan:Coba: Kirim[ { "title": "Kindred", "year": 1979 }, { "title": "Dune", "year": 1965 } ]GET /books/newest. Kamu akan mendapatkan Kindred (1979), Dune (1965), dan Emma (1815), dalam urutan itu, masing-masing hanya dengan judul dan tahun. KirimGET /books/newest?n=1: kamu akan mendapatkan[ { "title": "Kindred", "year": 1979 } ]. Jika kamu mendapatkan 400,GET /books/:idyang menangani permintaan itu, jadi pindahkan rute tersebut ke atasnya.
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 filter = {};
if (req.query.author) {
filter.author = req.query.author;
}
if (req.query.from || req.query.to) {
filter.year = {};
if (req.query.from) {
filter.year.$gte = Number(req.query.from);
}
if (req.query.to) {
filter.year.$lte = Number(req.query.to);
}
}
const list = await books.find(filter).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');
});
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
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