Menu
CoddyTech

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.

challenge icon

Görev

Kolay

Bu 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.

  1. server.js içinde GET /books rotasını değiştirin. Sorgu dizesinden bir filtre nesnesi oluşturun ve bunu find işlevine geçirin. Rota, kitaplardan oluşan bir JSON dizisi yanıtlamaya devam eder.
  2. ?author=Jane%20Austen, yalnızca author değeri tam olarak Jane Austen olan kitapları döndürür. (%20, URL'de boşluğun nasıl yazıldığını gösterir.)
  3. ?from=1960, year değ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.
  4. Sorgu değerleri her zaman dizeler olarak gelir, ancak kayıtlı yıllar sayıdır. from ve to değerlerini filtreye eklemeden önce sayılara dönüştürün; yoksa hiçbir eşleşme olmaz.
  5. Sorgu yoksa rota, önceden olduğu gibi tüm kitapları döndürür. Deneyin: GET /books?from=1960&to=1980 isteğini gönderin: Dune (1965) ve Kindred (1979) gelir. GET /books?from=1970 isteğini gönderin: yalnızca Kindred gelir. GET /books?to=1900 isteğini gönderin: yalnızca Emma (1815) gelir. GET /books?author=Jane%20Austen isteğini gönderin: yalnızca Emma gelir. GET /books isteğ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