Từ SQL sang NoSQL

Dán một câu lệnh SQL SELECT và công cụ chuyển đổi sẽ viết lại thành một truy vấn find() tương đương của MongoDB. Nó ánh xạ các cột được chọn thành một phép chiếu, mệnh đề WHERE thành một bộ lọc, ORDER BY thành .sort() và LIMIT thành .limit(). Đây là công cụ viết lại truy vấn cho các câu lệnh đơn giản, không phải công cụ di chuyển dữ liệu: JOIN, GROUP BY, các phép tổng hợp và truy vấn con không được hỗ trợ.

Cách hoạt động của việc chuyển đổi

  1. 1

    Phân tích câu SELECT

    Công cụ đọc một câu lệnh duy nhất theo dạng `SELECT các_cột FROM bảng [WHERE ...] [ORDER BY ...] [LIMIT n]`.

  2. 2

    Ánh xạ từng mệnh đề

    Các cột trở thành một phép chiếu `{ col: 1 }`, `WHERE` trở thành một bộ lọc, `ORDER BY` trở thành `.sort()` và `LIMIT` trở thành `.limit()`.

  3. 3

    Dịch các toán tử

    Các toán tử so sánh được ánh xạ sang toán tử Mongo: `>` sang `$gt`, `<` sang `$lt`, `>=` sang `$gte`, `<=` sang `$lte`, `!=` sang `$ne`, và `=` sang một phép khớp trực tiếp.

  4. 4

    Sao chép kết quả

    Dòng `db.collection.find(...)` được tạo ra đã sẵn sàng để dán vào shell mongosh hoặc một lời gọi driver.

Một ví dụ thực tế

SQL:

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

Truy vấn MongoDB:

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

Những gì công cụ ánh xạ

SQL MongoDB find()
SELECT a, b phép chiếu { a: 1, b: 1 }
SELECT * tất cả các trường (phép chiếu rỗng)
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)

Những gì không được hỗ trợ

  • JOIN. Chỉ một bảng duy nhất được đọc. Kết hợp các collection cần $lookup hoặc một mô hình dữ liệu phi chuẩn hóa, đó là một quyết định về lược đồ, không phải việc viết lại truy vấn.
  • GROUP BY và các phép tổng hợp. COUNT, SUM, AVG và GROUP BY cần đến pipeline tổng hợp (db.collection.aggregate([...])), thứ mà công cụ này không tạo ra.
  • Truy vấn con, CTE và hàm cửa sổ. Hãy xem lại mô hình hoặc chia công việc thành nhiều giai đoạn; chúng không thể biểu diễn trong một find().
  • IN, LIKE và BETWEEN. Bộ phân tích WHERE chỉ xử lý các toán tử so sánh =, >, <, >=, <=, != và <>.
  • Trộn lẫn AND và OR. Một mệnh đề WHERE được xử lý toàn bộ là AND hoặc toàn bộ là OR; đừng kết hợp cả hai trong cùng một câu lệnh.
  • INSERT, UPDATE, DELETE, CREATE TABLE. Chỉ SELECT được chuyển đổi.

Về kết quả đầu ra

Kết quả luôn là một dòng duy nhất db.collection.find(bộ_lọc, phép_chiếu), có thể theo sau bởi .sort() và .limit(). Nó nhắm đến shell và các driver của MongoDB. Nó không tạo ra truy vấn Firestore hay Elasticsearch, và không chọn chỉ mục hay tối ưu hóa hiệu năng. Hãy kiểm thử truy vấn trên dữ liệu của bạn trước khi tin dùng.

Câu hỏi thường gặp

Không. Kết quả luôn là một truy vấn find() của MongoDB cho shell mongosh hoặc một driver. Không có bộ chọn đích cho các kho lưu trữ tài liệu khác.

Không. Những thứ đó cần pipeline tổng hợp của MongoDB (aggregate([...])), thứ mà công cụ này không tạo ra. Nó chỉ tạo truy vấn find() với bộ lọc, phép chiếu, sắp xếp và giới hạn.

Không. Chỉ một bảng FROM duy nhất được đọc. Các kho NoSQL ưu tiên nhúng hoặc tham chiếu, nên một JOIN thường có nghĩa là thay đổi mô hình dữ liệu, không phải viết lại truy vấn.

Không. Chỉ các câu lệnh SELECT được chuyển đổi. Các collection trong MongoDB mặc định không có lược đồ, nên không có định nghĩa bảng nào để dịch.

Công cụ liên quan

Công cụ này có phiên bản bằng các ngôn ngữ khác