Sorgu Filtreleri
Coddy'nin Node.js Journey'sinin MongoDB ile Veritabanları bölümünün bir parçası. Ders 9 / 29.
İstemci çoğu zaman yalnızca bazı kitapları ister ve seçim işini veritabanı yapabilir.
find yöntemine verdiğin nesne bir filtredir: filtredeki her alan eşleştiğinde belge eşleşir. Düz bir değer eşitlik anlamına gelir. Operatör, bunun yerine karşılaştırma yapan ve $ ile başlayan bir anahtardır: $gte büyük veya eşit, $lte küçük veya eşit anlamına gelir. Aynı alandaki iki operatör tek bir nesneyi paylaşır: { total: { $gte: 20, $lte: 50 } } toplamları 20 ile 50 arasında tutar.
// 20 veya üzeri tutardaki ödenmiş siparişler
await orders.find({ status: 'paid', total: { $gte: 20 } }).toArray();Türler önemlidir: { $gte: '20' } bir dizeyi karşılaştırır ve MongoDB bir dizeyi sayı alanıyla hiçbir zaman eşleştirmez. req.query içindeki her şey bir dizedir, bu yüzden sayıları filtreye eklemeden önce Number() ile sayıya dönüştür.
Görev
KolayBu adım, Finding by ObjectId dersindeki proje dosyalarınız yerine, kurs için hazırlanmış kitaplık API projesini açar (server.js dâhil). Önceki çalışmalarınız kendi dersinde kalır. server.js dosyasını düzenlemeden önce sağlanan dosyaları okuyun. Bu kopyada kitap ekleme ve ObjectId ile arama rotaları bulunur.
İstemciler yalnızca bazı kitapları istiyor: bir yazarın kitaplarını veya belirli yıllardaki kitapları. Bırakın veritabanı bunları seçsin.
server.jsiçindeGET /booksrotasını değiştirin. Sorgu dizesinden bir filtre nesnesi oluşturun ve bunufindişlevine geçirin. Rota, kitaplardan oluşan bir JSON dizisi yanıtlamaya devam eder.?author=Jane%20Austen, yalnızcaauthordeğeri tam olarakJane Austenolan kitapları döndürür. (%20, URL'de boşluğun nasıl yazıldığını gösterir.)?from=1960,yeardeğeri 1960 veya daha sonrası olan kitapları döndürür.?to=1980, 1980 veya daha öncesindeki kitapları döndürür. İkisi de kullanıldığında, bir kitabın bu iki yıl arasında olması gerekir ve yılların kendileri de aralığa dâhildir. Bunlardan herhangi biri tek başına kullanılabilir.- Sorgu değerleri her zaman dizeler olarak gelir, ancak kayıtlı yıllar sayıdır.
fromvetodeğerlerini filtreye eklemeden önce sayılara dönüştürün; yoksa hiçbir eşleşme olmaz. - Sorgu yoksa rota, önceden olduğu gibi tüm kitapları döndürür. Deneyin:
GET /books?from=1960&to=1980isteğini gönderin: Dune (1965) ve Kindred (1979) gelir.GET /books?from=1970isteğini gönderin: yalnızca Kindred gelir.GET /books?to=1900isteğini gönderin: yalnızca Emma (1815) gelir.GET /books?author=Jane%20Austenisteğini gönderin: yalnızca Emma gelir.GET /booksisteğini gönderin: üçünün tamamı gelir.
Kendin dene
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());
// Her hata { error: message } biçiminde yanıt verir.
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');
});
MongoDB ile Veritabanları bölümündeki tüm dersler
Kendi başına pratik yap: Express playground