SQL'den NoSQL'e

Tek bir SQL SELECT ifadesi yapıştırın; dönüştürücü onu eşdeğer bir MongoDB find() sorgusuna yeniden yazar. Seçilen sütunları bir projeksiyona, WHERE tümcesini bir filtreye, ORDER BY'ı .sort()'a ve LIMIT'i .limit()'e eşler. Basit ifadeler için bir sorgu yeniden yazıcısıdır, bir taşıma aracı değil: JOIN, GROUP BY, toplamalar ve alt sorgular desteklenmez.

Dönüştürme nasıl çalışır

  1. 1

    SELECT'i ayrıştır

    Araç, `SELECT sütunlar FROM tablo [WHERE ...] [ORDER BY ...] [LIMIT n]` biçiminde tek bir ifade okur.

  2. 2

    Her tümceyi eşle

    Sütunlar bir projeksiyon `{ col: 1 }` olur, `WHERE` bir filtre olur, `ORDER BY` `.sort()` olur ve `LIMIT` `.limit()` olur.

  3. 3

    Operatörleri çevir

    Karşılaştırma operatörleri Mongo operatörlerine eşlenir: `>` `$gt`'ye, `<` `$lt`'ye, `>=` `$gte`'ye, `<=` `$lte`'ye, `!=` `$ne`'ye ve `=` doğrudan bir eşleşmeye.

  4. 4

    Çıktıyı kopyala

    Üretilen `db.collection.find(...)` satırı mongosh kabuğuna ya da bir sürücü çağrısına yapıştırmaya hazırdır.

Çözümlü bir örnek

SQL:

SELECT name, price FROM products WHERE price > 100 ORDER BY price DESC LIMIT 5;

MongoDB sorgusu:

db.products.find({ price: { $gt: 100 } }, { name: 1, price: 1 }).sort({ price: -1 }).limit(5)

Dönüştürücünün eşlediği şeyler

SQL MongoDB find()
SELECT a, b projeksiyon { a: 1, b: 1 }
SELECT * tüm alanlar (boş projeksiyon)
FROM users db.users.find(...)
WHERE a = 5 { a: 5 }
WHERE a > 5 { a: { $gt: 5 } }
WHERE a >= 5 { a: { $gte: 5 } }
WHERE a != 5 { a: { $ne: 5 } }
WHERE a AND b { a: ..., b: ... }
WHERE a OR b { $or: [ ... ] }
ORDER BY a DESC .sort({ a: -1 })
LIMIT 10 .limit(10)

Desteklenmeyenler

  • JOIN’ler. Yalnızca tek bir tablo okunur. Koleksiyonları birleştirmek $lookup ya da normalleştirilmemiş bir veri modeli gerektirir; bu bir şema kararıdır, bir sorgu yeniden yazımı değil.
  • GROUP BY ve toplamalar. COUNT, SUM, AVG ve GROUP BY, bu aracın üretmediği toplama hattını (db.collection.aggregate([...])) gerektirir.
  • Alt sorgular, CTE’ler ve pencere fonksiyonları. Modeli yeniden düşünün ya da işi aşamalara bölün; bunlar bir find() içinde ifade edilemez.
  • IN, LIKE ve BETWEEN. WHERE ayrıştırıcısı yalnızca =, >, <, >=, <=, != ve <> karşılaştırma operatörlerini işler.
  • AND ile OR karıştırma. Bir WHERE tümcesi tümüyle AND ya da tümüyle OR olarak ele alınır; ikisini aynı ifadede birleştirmeyin.
  • INSERT, UPDATE, DELETE, CREATE TABLE. Yalnızca SELECT dönüştürülür.

Çıktı hakkında

Sonuç her zaman tek bir db.collection.find(filtre, projeksiyon) satırıdır ve isteğe bağlı olarak .sort() ve .limit() eklenir. MongoDB kabuğunu ve sürücülerini hedefler. Firestore ya da Elasticsearch sorguları üretmez ve indeks seçmez ya da performansı optimize etmez. Ona güvenmeden önce sorguyu kendi verilerinizle test edin.

Sık Sorulan Sorular

Hayır. Çıktı her zaman mongosh kabuğu ya da bir sürücü için bir MongoDB find() sorgusudur. Diğer belge depoları için bir hedef seçici yoktur.

Hayır. Bunlar, bu aracın üretmediği MongoDB toplama hattını (aggregate([...])) gerektirir. Yalnızca filtre, projeksiyon, sıralama ve limit içeren find() sorguları üretir.

Hayır. Yalnızca tek bir FROM tablosu okunur. NoSQL depoları gömmeyi ya da referans vermeyi yeğler; bu yüzden bir JOIN genellikle bir sorgu yeniden yazımı değil, bir veri modeli değişikliği anlamına gelir.

Hayır. Yalnızca SELECT ifadeleri dönüştürülür. MongoDB koleksiyonları varsayılan olarak şemasızdır; bu nedenle çevrilecek bir tablo tanımı yoktur.

İlgili Araçlar

Araç diğer dillerde mevcuttur