🍃

MongoDB基礎4:CRUD オペレーション

2021/10/08に公開

引き続き、MongoDB Universityで提供されているオンラインコース"MongoDB Basics"の要点をまとめていきます。今回はChapter4 - "Advanced CRUD Operations"です。

クエリオペレーター

前回の記事では、更新オペレーター(set,inc,$unset)を使って、データベースにあるデータを更新する方法についてまとめました。

対して、クエリオペレーターはデータベースにあるデータを見つけ出す手助けをしてくれます。
クエリオペレーターにもいくつか種類があります。

  • 比較オペレーター
  • 論理オペレーター
  • 配列オペレーター

1つずつみていきましょう。

比較オペレーター

主な比較オペレーターは以下。

オペレーター 操作
$eq (equal to) 一致するレコードを表示
$ne (not equal to) 一致しないレコードを表示
$gt (greater than)より大きいレコードを表示
$gte (greater than or equal to)より大きいか一致するレコードを表示
$lt (less than)より小さいレコードを表示
$lte (less than or equal to)より小さいか一致するレコードを表示

例えば、1000円以内で提供されているラーメン以外のメニューを全て表示したいとします。これは、以下のようなコマンドで実現が可能です。

db.dishes.find({ "price": { "$lte" : 1000 }, "dishtype": { "$ne": "Ramen" } })

逆に、1000円以内で提供されているラーメンのメニューを全て表示したい場合はどうでしょうか。この場合は、以下のように"ne"を"eq"に置き換えることで実行できます。

db.dishes.find({ "price": { "$lte" : 1000 }, "dishtype": { "$eq": "Ramen" } })

できますが、この場合"$eq"を含まない以下のようなコマンドでも同じ結果が得られます。

db.dishes.find({ "price": { "$lte" : 1000 }, {"dishtype": "Ramen" })

つまり$eqはデフォルトでクエリの検索条件として適応されています。

論理オペレーター

まさに条件分岐で使用する演算子に近いですね。
主な論理オペレーターは以下。

オペレーター 操作
$and 全ての条件に当てはまるレコードを表示
$or 一つでも条件に当てはまるレコードを表示
$nor 2つの条件のうちどちらにも当てはまらないレコードを表示
$not 不随した条件に当てはまらないレコードを表示

論理オペレーターの$notは使用フォーマットに以下の違いがあります。

オペレーター フォーマット
$and
$or
$nor
{<オペレーター>: [<条件1>,<条件2>,...]}
$not {$not: <条件>}

配列オペレーター

ここまでみてきたオペレーターは文字列や数字、ブール型などに対してのクエリを実行するオペレーターでした。一方で、配列オペレーターは文字通り配列バリューに対するクエリを実行するものです。

主な配列オペレーターは以下。

オペレーター 操作
$size 配列フィールドの要素数が一致するものを表示
$all 要素の順序に関係なく、指定した要素全てを配列に含むレコードを表示

配列フィールドの要素単体でクエリを実行した場合、その要素が配列フィールド含まれる全てのドキュメントが表示されます。

まとめ

  • 比較オペレーターを用いることで、値の一致のみではなく、値の範囲を指定してクエリを実行することができる。
  • 論理オペレーターを用いることで、より複雑な条件でのクエリを作ることが可能になる。
  • 配列オペレーターを用いることで、配列フィールドに含まれる要素の数や順序によってクエリを実行できるようになる。

Discussion