


SQL に似た構文でクエリできる PHP バージョンの MONGODB 構文パーサーを作成しました。必要な人がいるかどうかわかりませんので、共有してください。
转载请注明作者:wetouns
在使用MONGODB的时候写查询语句总是一件让人蛋疼的事情,如果查询复杂一点,要嵌套好多层对象,于是我就想,能不能使用类似SQL的语法来进行查询呢,这样子代码看起来更加易懂,书写也更为简单,于是就花了些时间把这个想法变为现实该解析器会将类似SQL的语法转换成MONGODB的查询对象,目前条件判断只支持and和or,以及>,<,>=,<=,=的查询,还支持括号表示判断的优先级哦,更多的暂时不支持,想扩展的可以自己改源码,简单说明一下语法和用法吧
例1,我要查询a=0的文档
$query = new MongoQueryParser(); $query->query("a=0"); $queryRst = $query->result;<br>最终$queryRst的结果将会如下图 <p><img src="/static/imghw/default1.png" data-src="http://image.codes51.com/Article/image/20150101/20150101160034_8499.png" class="lazy" alt=""><br></p> <p>例2:</p> <p>这回来个复杂点的</p> <pre code_snippet_id="569418" snippet_file_name="blog_20150101_2_7195815" name="code">$query = new MongoQueryParser(); $query->query("a=0 && b > 2"); $queryRst = $query->result;
例3:
再来个更复杂的
$query = new MongoQueryParser(); $query->query("(a=0 && b > 2) || c <= 5"); $queryRst = $query->result;
看完以上3个例子,相信不用说明用法,应该也会用了吧,嘿嘿,废话少说,贴上解析器的源码
<?php class MongoQueryParser { function __construct() { $this->result =[]; } public $result; public $leftFirstReg = "/\\(([^\\s]+)\\)(&&|\\|\\|)([^\\s]+$)/";//匹配左括号优先 public $rightFirstReg = "/([^\\s]+?)(&&|\\|\\|)\\(([^\\s]+)\\)$/";//右括号优先 public $allReg = "/\\(([^\\s]+)\\)(&&|\\|\\|)\\(([^\\s]+)\\)$/";//左右括号模式 public $reg1 = "/([^\\s]+)(&&|\\|\\|)([^\\s]+)/"; public $reg2 = "/([\\w]+)([=<>]+)([^\\s]+)/"; public $opMap = [">"=>'$gt',"<"=>'$lt',">="=>'$gte',"<="=>'$lte']; private $meetOr = false; /** * 将自定义的查询语句转换成MONGODB的查询语句 * 例1:a=3 * 例2:a>0&&a<2 * 例3:a>0&&a<2||c>3 */ function query($query){ $query =preg_replace("/\s/","",$query); $this->result = $this->exec($query,false,false); return $this->result; } function exec($query,$layer,$fromAnd){ if(preg_match($this->allReg, $query,$matches1) > 0 || preg_match($this->rightFirstReg, $query,$matches2) > 0 || preg_match($this->leftFirstReg, $query,$matches3) > 0 || preg_match($this->reg1, $query,$matches4)){ $mat = null; $leftSame = false; $rightSame = false; if(count($matches1) > 0){ $mat = $matches1; }else if(count($matches2) > 0){ $leftSame = true; $rightSame = false; $mat = $matches2; }else if(count($matches3) > 0){ $leftSame = false; $rightSame = true; $mat = $matches3; }else if(count($matches4) > 0){ $leftSame = true; $rightSame = true; $mat = $matches4; } $op = $mat[2]; $left = $mat[1]; $right = $mat[3]; if($op == "&&"){//如果操作符是AND $rst = null; if(!$layer || !$fromAnd){//如果不同层,或者调用来自上一层的or,那么就建立一个$and操作符 $rst['$and'] = []; $larr = $this->exec($mat[1],$leftSame,true); $rarr = $this->exec($mat[3],$rightSame,true); $rst['$and'] = $this->mergeArr($rst['$and'],$larr, $rarr); return $rst; }else{//如果同层,直接把值都放到同层数组去 $rst = array_merge($this->exec($mat[1],$leftSame,true),$this->exec($mat[3],$rightSame,true)); return $rst; } }else if($op == "||"){ if(!$layer || $fromAnd){//如果不同层 $rst['$or'] = []; $larr = $this->exec($mat[1],$leftSame,false); $rarr = $this->exec($mat[3],$rightSame,false); $rst['$or'] = $this->mergeArr($rst['$or'],$larr, $rarr); }else{ $rst = []; $rst = array_merge($this->exec($mat[1],$leftSame,false),$this->exec($mat[3],$rightSame,false)); } return $rst; } } else{//如果最终已经分解成a=b的形式时,就在此解析 preg_match($this->reg2, $query,$matches); if(count($matches) >= 4){ $left = $matches[1]; $op = $matches[2]; $right = $matches[3]; $rst = []; if($op == "="){ if(is_numeric($right)){ $rst[$left] = (float)$right; }else{ $rst[$left] = $right; } }else{ if(!isset($rst[$left])){ $rst[$left] = []; } if(is_numeric($right)){ $rst[$left][$this->opMap[$op]] = (float)$right; }else{ $rst[$left][$this->opMap[$op]] = $right; } } return $rst; } } } function mergeArr($rst,$larr,$rarr){ foreach ($larr as $lk=>$lv){ $lcond = []; $lcond[$lk] = $lv; $rst[] = $lcond; } foreach ($rarr as $rk=>$rv){ $rcond = []; $rcond[$rk] = $rv; $rst[] = $rcond; } return $rst; } } ?>
好了,就这么多内容,我想应该会有人需要的
有什么问题直接留言吧
以上就介绍了写了一个PHP版本的MONGODB语法解析器,可以通过类似SQL的语法来进行查询,不知道有人需要不,分享一下吧,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











多くのユーザーはスマートウォッチを選ぶときにファーウェイブランドを選択しますが、その中でもファーウェイ GT3pro と GT4 は非常に人気のある選択肢であり、多くのユーザーはファーウェイ GT3pro と GT4 の違いに興味を持っています。 Huawei GT3pro と GT4 の違いは何ですか? 1. 外観 GT4: 46mm と 41mm、材質はガラスミラー + ステンレススチールボディ + 高解像度ファイバーバックシェルです。 GT3pro: 46.6mm および 42.9mm、材質はサファイアガラス + チタンボディ/セラミックボディ + セラミックバックシェルです。 2. 健全な GT4: 最新の Huawei Truseen5.5+ アルゴリズムを使用すると、結果はより正確になります。 GT3pro: ECG 心電図と血管と安全性を追加

Windows 11 で Snipping Tool が機能しない理由 問題の根本原因を理解すると、適切な解決策を見つけるのに役立ちます。 Snipping Tool が正しく動作しない主な理由は次のとおりです。 フォーカス アシスタントがオンになっている: これにより、Snipping Tool が開かなくなります。破損したアプリケーション: 起動時にスニッピング ツールがクラッシュする場合は、破損している可能性があります。古いグラフィック ドライバー: 互換性のないドライバーは、スニッピング ツールに干渉する可能性があります。他のアプリケーションからの干渉: 実行中の他のアプリケーションが Snipping Tool と競合する可能性があります。証明書の有効期限が切れています: アップグレード プロセス中のエラーにより、この問題が発生する可能性があります。これらの簡単な解決策は、ほとんどのユーザーに適しており、特別な技術知識は必要ありません。 1. Windows および Microsoft Store アプリを更新する

この記事では、PowerQuery で複数の列をドラッグ アンド ドロップで並べ替える方法を説明します。さまざまなソースからデータをインポートする場合、列が希望の順序にならないことがよくあります。列の順序を変更すると、分析やレポートのニーズに合った論理的な順序で列を配置できるだけでなく、データの読みやすさが向上し、フィルタリング、並べ替え、計算の実行などのタスクが高速化されます。 Excelで複数の列を並べ替えるにはどうすればよいですか? Excel で列を再配置する方法はたくさんあります。列ヘッダーを選択し、目的の場所にドラッグするだけです。ただし、多くの列を含む大きなテーブルを扱う場合、このアプローチは面倒になる可能性があります。列をより効率的に再配置するには、拡張されたクエリ エディターを使用できます。クエリの強化

ReactQuery データベース プラグイン: データのインポートとエクスポートを実装するためのメソッド、特定のコード サンプルが必要 フロントエンド開発で ReactQuery が広く適用されるようになり、ますます多くの開発者がデータ管理に ReactQuery を使用し始めています。実際の開発では、多くの場合、データをローカル ファイルにエクスポートしたり、ローカル ファイルからデータベースにデータをインポートしたりする必要があります。これらの機能をより便利に実装するには、ReactQuery データベース プラグインを使用できます。 ReactQuery データベース プラグインは一連のメソッドを提供します

パート 1: 最初のトラブルシューティング手順 Apple のシステムステータスを確認する: 複雑な解決策を掘り下げる前に、基本から始めましょう。問題はデバイスにあるのではなく、Apple のサーバーがダウンしている可能性があります。 Apple のシステム ステータス ページにアクセスして、AppStore が適切に動作しているかどうかを確認してください。問題があれば、Apple が修正してくれるのを待つしかありません。インターネット接続を確認します。「AppStore に接続できません」問題は接続不良が原因である場合があるため、安定したインターネット接続があることを確認してください。 Wi-Fi とモバイル データを切り替えるか、ネットワーク設定をリセットしてみてください ([一般] > [リセット] > [ネットワーク設定のリセット] > [設定])。 iOS バージョンを更新します。

php提交表单通过后,弹出的对话框怎样在当前页弹出php提交表单通过后,弹出的对话框怎样在当前页弹出而不是在空白页弹出?想实现这样的效果:而不是空白页弹出:------解决方案--------------------如果你的验证用PHP在后端,那么就用Ajax;仅供参考:HTML code

この記事は、vue ソース コードを解釈するのに役立ち、これを使用して Vue2 のさまざまなオプションのプロパティにアクセスできる理由を紹介します。

同僚は、これによって指摘されたバグのために立ち往生しました。Vue2 のこの指摘の問題により、アロー関数が使用され、その結果、対応する props を取得できなくなりました。私がそれを彼に紹介したとき、彼はそれを知りませんでした。その後、私はわざとフロントエンド コミュニケーション グループに目を向けました。これまでのところ、フロントエンド プログラマーの少なくとも 70% はまだそれを理解していません。今日私はそれを共有しますyou this link. もしすべてが間違っている場合 まだ学習していない場合は、大きな口を与えてください。
