Memperbarui Dokumen
Termasuk bagian Database dengan MongoDB dalam perjalanan Node.js di Coddy. Pelajaran 14 dari 29.
Memperbaiki tahun sebuah buku seharusnya mengubah satu field itu saja dan membiarkan field lainnya tetap.
updateOne(filter, update) mengubah dokumen pertama yang cocok dengan filter. Pembaruan terdiri dari operator: $set menulis field yang kamu berikan dan mempertahankan semua field lainnya. Objek biasa tanpa operator ditolak dengan pesan "Update document requires atomic operators".
const result = await players.updateOne(
{ name: 'Ada' },
{ $set: { score: 120, level: 4 } }
);
result.matchedCount; // 1 jika ada pemain yang cocok, 0 jika tidak ada
result.modifiedCount; // 0 jika nilainya sudah samaBedakan dokumen yang tidak ditemukan dari dokumen yang tidak berubah menggunakan matchedCount, bukan modifiedCount. Pembaruan tidak mengembalikan dokumen, jadi baca lagi dengan findOne.
Tantangan
MudahKlien ingin memperbaiki satu field pada buku, seperti tahun yang salah, tanpa mengirim ulang seluruh buku.
- Di
server.js, di bawah komentar// Add PATCH /books/:id here., tambahkan routePATCH /books/:id. - Mulailah seperti cara
GET /books/:iddimulai sekarang: panggilparseId(req, res). Jika id tidak valid,parseIdsudah merespons dengan 400 dan mengembalikannull, jadi berhenti di situ. - Ubah hanya field yang dikirim oleh body, dan biarkan semua field lainnya seperti semula. Body
{ "year": 1966 }mengubah tahun saja. - Jika tidak ada buku dengan
_idtersebut, balas dengan status 404 dan error, misalnya{ "error": "No such book" }. - Jika tidak, balas dengan status 200 dan seluruh buku seperti yang tersimpan sekarang:Coba: Kirim
{ "_id": "6720a1f4c2b9e81d3a5f0c11", "title": "Dune", "author": "Frank Herbert", "year": 1966, "isbn": "9780441013593", "genre": "scifi" }GET /booksdan salin_idmilik Dune. Salin lagi setelah setiap kali menekan tombol “Jalankan”, karena setiap kali dijalankan akan menghasilkan id baru. KirimPATCH /books/diikuti_idmilik Dune, dengan body{ "year": 1966 }. Kamu mendapat 200 dan Dune dengan"year": 1966, sementara semua field lainnya tidak berubah, dan tab Data menampilkan hal yang sama. Kirim permintaan yang sama sekali lagi: kamu tetap mendapat 200, karena bukunya ada meskipun kali ini tidak ada yang berubah. KirimPATCH /books/000000000000000000000000dengan{ "year": 1966 }: kamu mendapat 404. KirimPATCH /books/42: kamu mendapat 400.
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 });
}
// Kembalikan :id sebagai ObjectId, atau null setelah mengirim respons 400 jika id tidak valid.
function parseId(req, res) {
if (ObjectId.isValid(req.params.id)) {
return new ObjectId(req.params.id);
}
sendError(res, 400, 'Not a valid id');
return null;
}
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/newest', async (req, res) => {
const n = Number(req.query.n) || 3;
const list = await books
.find({}, { projection: { title: 1, year: 1, _id: 0 } })
.sort({ year: -1 })
.limit(n)
.toArray();
res.json(list);
});
app.get('/books/:id', async (req, res) => {
const id = parseId(req, res);
if (!id) return;
const book = await books.findOne({ _id: id });
if (!book) {
return sendError(res, 404, 'No such book');
}
res.json(book);
});
// Tambahkan PATCH /books/:id di sini.
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