MongoDBでのクエリメモ

<h1>はじめに</h1>
MongoDBはリレーショナルデータベース（RDB）と違い、SQLは使用できない。
その代わりにMongoDB特有の「Mongoクエリ言語」を用いる。
このクエリはjson形式で書く。

MongoDBの特徴としては、スキーマレスであり、RDBより高速（データを「キー：バリュー」の配列で保持しているため）。
ただ、結合等の複雑な処理には向かない。
※その他諸々違いはあるが、今回は割愛

この記事は、自分のメモ用にRDBとのクエリの違いを中心に記載していく。
→引き続き、追記予定

<h1>早見表</h1>
<h4>データ構造</h4>
<table>
<tr><th>RDBでの呼称</th><th>Mongoでの呼称</th></tr>
<tr><td>database</td><td>database</td></tr>
<tr><td>table</td><td>collection</td></tr>
<tr><td>row</td><td>document</td></tr>
<tr><td>column</td><td>field</td></tr>
<tr><td>index</td><td>index</td></tr>
<tr><td>primary key</td><td>_id</td></tr>
</table>
<p>MongoDBでは，"_id"の値に自動的に一意な文字列が採番される</p>

<h4>データ操作</h4>
<p>この記事では、RDBの例としてMYSQLを使用する</p>
<table>
  <tr><th>MySQL</th><th>mongo</th>
  </tr>
  <tr>
    <td>SHOW DATABASES;</td>
    <td>show dbs</td>
  </tr>
  <tr>
    <td>USE testdb;</td>
    <td>use testdb</td>
  </tr>
  <tr>
    <td>CREATE DATABASE testdb;</td>
    <td>useコマンドで自動生成</td>
  </tr>
  <tr>
    <td>DROP DATABASE testdb;</td>
    <td>db.dropDatabase()</td>
  </tr>
</table>

<h4>コレクション操作</h4>
<table>
<tr><th>MySQL</th><th>MongoDB</th></tr>
  <tr>
    <td>CREATE TABLE items (...);</td>
    <td>db.createCollection("items")</td></tr></td>
  </tr>
  <tr>
    <td>SHOW TABLES;</td>
    <td>show collections</td>
  </tr>
  <tr>
    <td>DROP TABLE items;</td>
    <td>db.items.drop</td>
  </tr>
  <tr>
    <td>TRUNCATE TABLE items;</td>
    <td> db.items.remove()</td>
  </tr>
</table>
</div>

<h4>選択</h4>
<table>
  <tr><th>MySQL</th><th>MongoDB</th></tr>
  <tr>
    <td>SELECT * FROM items;</td>
    <td>db.items.find()</td>
  </tr>
  <tr>
    <td>SELECT name FROM items WHERE category='A' AND stock<=10 ORDER BY name;</td>
    <td>db.items.find({category:'A',stock:{$lte:10}},{name:1}).sort({name:1})</td>
  </tr>
  <tr>
    <td>SELECT COUNT(*) FROM items;</td>
    <td>db.items.count()</td>
  </tr>
  <tr>
    <td>SELECT COUNT(*) FROM items WHERE name LIKE "%hoge%" OR category='C';</td>
    <td>db.items.find({$or:[{name:/hoge/},{category:'C'}]}).count()</td>
  </tr>
  <tr>
    <td>SELECT COUNT(stock) FROM items;</td>
    <td>db.items.find({stock:{$exists:true}}).count()</td>
  </tr>
  <tr>
    <td>SELECT * FROM items LIMIT 1;</td>
    <td>db.items.findOne()</td>
  </tr>
  <tr>
    <td>SELECT * FROM items LIMIT 5</td>
    <td>db.items.find().limit(5)</td>
  </tr>
  <tr>
    <td>SELECT * FROM items LIMIT 3 OFFSET 2</td>
    <td>db.items.find().skip(2).limit(3)</td>
  </tr>
</table>
</div>

<h4>挿入</h4>
<table>
<tr><th>MySQL</th><th>MongoDB</th></tr>
<tr>
  <td>INSERT INTO items VALUES('A',"hoge",5);</td>
  <td>db.items.insert({ category : 'A' , name : "hoge" , stock : 5 })</td></tr>
</table>
</div>

<h4>更新</h4>
<table>
<tr><th>MySQL</th><th>MongoDB</th></tr>
<tr>
  <td>UPDATE items SET stock=10 WHERE category='A';</td>
  <td>db.items.update({category:'A'},{$set:{stock:10}},false,true)</td>
</tr>
<tr>
  <td>UPDATE items SET stock=stock+10 WHERE category='A';</td>
  <td>db.items.update({category:'A'},{$inc:{stock:10}},false,true)
  </td>
</tr>
</table>
</div>

<h4>削除</h4>
<table>
  <tr><th>MySQL</th><th>MongoDB</th></tr>
  <tr>
    <td>DELETE FROM items WHERE name="hoge";</td>
    <td>db.items.remove({name:"hoge"})</td>
  </tr>
</table>
</div>

<h4>演算子</h4>
<table>
<thead>
  <tr>
    <th>演算子</th>
    <th>意味</th>
  </tr>
</thead>
<tbody>
  <tr>
    <td>$lt</td>
    <td>より小さい</td>
  </tr>
  <tr>
    <td>$lte</td>
    <td>以下</td>
  </tr>
  <tr>
    <td>$gt</td>
    <td>より大きい</td>
  </tr>
  <tr>
    <td>$gte</td>
    <td>以上</td>
  </tr>
  <tr>
    <td>$ne</td>
    <td>等しくない</td>
  </tr>
  <tr>
    <td>$exists</td>
    <td>存在有無</td>
  </tr>
  <tr>
    <td>$or</td>
    <td>OR条件</td>
  </tr>
</tbody>
</table>


<h4>その他</h4>
参考記事は[こちら](https://gihyo.jp/dev/serial/01/mongodb/0003?page=2)