MongoDBのクエリをSQLのWHERE句に変換してみるテスト

全くもって誰得なんですが、ちょっと訳あってこういう感じのものが必要そうなので作ってみました。まだ MySQL に投げたわけじゃないので文法的にホントにあってるかとか、そもそもプレースホルダ使えよとか色々あると思いますが、自分としては再帰呼び出し使って AND と OR をそれっぽく解釈できたかなと思うのでひとまずシェア。

追記

コメントでも指摘されましたので、プレースホルダ使う様に変更してみました。

こんな感じに変換してくれます。Mongo のクエリは、基本的に JSON like なので、フィールドとの関係を示す記号が「:」しかないので、オペレータとして新たにハッシュを作って条件与えるみたいな構造になるので、複雑な条件書こうとすると書くほうが発狂しそうになりますね!

あと、JSON なんで、同じフィールドに複数条件つけたい時は\$and で並べてあげる必要があることにこれ作ってて気づきました。OR を AND で繋ぎたい時にどうやるんだろうとかなり長いこと悩みました。。。

こうしてみると、SQL ってのは「問い合わせ言語」としてはとてもよく出来ているなぁと思いました。まぁ裏返して言うとそのパーザってやばいんだろうなぁと。。。MySQL のパーザとかコード読んだことはないですが、発狂しそう。。。

こんな感じで、普段触っているソフトウェアと同じような役割なんだけど違うアプローチのものを勉強すると、改めて普段使ってるもののありがたみとかが分かっちゃうし、一石二鳥ですばらしいですね!

というわけでやっつけで書いた Perl のコードはこちら。

  • AC 12-05-27 (日) 15:55

    とりあえず looks_like_number で数字っぽくないときの文字列に single-quote が入ってるとまずそうです

  • riywo 12-05-28 (月) 0:42

    > AC さん

    ありがとうございます。確かに><
    エスケープにも気をつけますー。