SQL から NoSQL へ

SQLのSELECT文を1つ貼り付けると、変換ツールが同等のMongoDBのfind()クエリに書き換えます。選択した列を射影に、WHERE句をフィルターに、ORDER BYを.sort()に、LIMITを.limit()にマッピングします。これは単純な文のためのクエリ書き換えツールであり、移行ツールではありません。JOIN、GROUP BY、集約、サブクエリには対応していません。

変換の仕組み

  1. 1

    SELECTを解析する

    このツールは`SELECT 列 FROM テーブル [WHERE ...] [ORDER BY ...] [LIMIT n]`という形の1つの文を読み取ります。

  2. 2

    各句をマッピングする

    列は射影`{ col: 1 }`に、`WHERE`はフィルターに、`ORDER BY`は`.sort()`に、`LIMIT`は`.limit()`になります。

  3. 3

    演算子を変換する

    比較演算子はMongoの演算子にマッピングされます。`>`は`$gt`、`<`は`$lt`、`>=`は`$gte`、`<=`は`$lte`、`!=`は`$ne`、`=`は直接一致です。

  4. 4

    出力をコピーする

    生成された`db.collection.find(...)`の行は、mongoshシェルやドライバー呼び出しにそのまま貼り付けられます。

具体例

SQL:

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

MongoDBのクエリ:

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

変換ツールがマッピングするもの

SQL MongoDB find()
SELECT a, b 射影 { a: 1, b: 1 }
SELECT * すべてのフィールド(空の射影)
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)

対応していないもの

  • JOIN。 読み取られるのは1つのテーブルだけです。コレクションの結合には$lookupか非正規化したデータモデルが必要で、これはクエリの書き換えではなくスキーマの判断です。
  • GROUP BYと集約。 COUNT、SUM、AVG、GROUP BYは集約パイプライン(db.collection.aggregate([...]))を必要とし、このツールはそれを生成しません。
  • サブクエリ、CTE、ウィンドウ関数。 モデルを考え直すか、作業を段階に分けてください。find()では表現できません。
  • IN、LIKE、BETWEEN。 WHEREのパーサーは比較演算子=、>、<、>=、<=、!=、<>のみを扱います。
  • ANDとORの混在。 WHERE句はすべてANDかすべてORとして扱われます。同じ文で両方を組み合わせないでください。
  • INSERT、UPDATE、DELETE、CREATE TABLE。 変換されるのはSELECTだけです。

出力について

結果は常に1行のdb.collection.find(フィルター, 射影)で、必要に応じて.sort()と.limit()が続きます。MongoDBのシェルとドライバーを対象としています。FirestoreやElasticsearchのクエリは生成せず、インデックスの選択やパフォーマンスの最適化も行いません。信頼して使う前に、ご自身のデータでクエリをテストしてください。

よくある質問

いいえ。出力は常にmongoshシェルまたはドライバー向けのMongoDBのfind()クエリです。他のドキュメントストア向けのターゲット選択はありません。

いいえ。それらにはMongoDBの集約パイプライン(aggregate([...]))が必要で、このツールはそれを生成しません。フィルター、射影、ソート、リミットを持つfind()クエリのみを生成します。

いいえ。読み取られるFROMテーブルは1つだけです。NoSQLストアは埋め込みや参照を好むため、JOINは通常クエリの書き換えではなくデータモデルの変更を意味します。

いいえ。変換されるのはSELECT文だけです。MongoDBのコレクションは既定でスキーマレスなので、変換すべきテーブル定義はありません。

関連ツール

このツールは他の言語でも利用できます