1. ホーム
  2. データベース
  3. モンゴルディーブ

MongoDBの条件付きクエリとソートについて説明します。

2022-01-24 07:32:32

findメソッド

クエリの基本形はdb.collection.find({conditions})で、条件はMySQLのWHERE条件と同様に任意で指定します。例は以下の通りです。

// Find all documents
db.collection.find({});
// find the specified conditions of the document
db.collection.find({key: value});
// find users whose nickname is island coder
db.users.find({nickname: 'Island Coder'});


条件付き組み合わせ

組み合わせ条件は、$and, $or, $not を使って設定できます。

// AND query format
db.collection.find({
  $and: [
    {key1: value1}, {key2: value2}
  ]
});

// OR query format
db.collection.find({
  $or: [
    {key1: value1}, {key2: value2}
  ]
});

// NOT query format
db.collection.find(
    {key: {$not: {conditional expression}}
);


例えば、次のようなusersデータセットがあります。

[
  {nickname: 'island coder', score: 90, gender: 'male'}, 
  {nickname: 'Mary', score: 98, gender: 'female'}, 
  {nickname: 'Tom', score: 76, gender: 'male'}, {nickname: 'Tom', score: 76, gender: 'male'}
]


スコア90または76のユーザーを検索します。

db.users.find({
  $or: [
    {score: 90}, {score: 76}
  ]
});


性別が男性でないユーザーを見つけ、スコアが80以上のユーザーを見つけるため。

db.users.find({
  gender: {$not: {$eq: 'male'}}
});

db.users.find({
  score: {$not: {$lt: 80}}
});


ここで、$eqは等号条件、$ltは小数条件です。条件は、and と or の入れ子で、for (a || b) && (c || d) のように、以下の形式で使用することができます。

// AND and OR nested query format
db.collection.find({
  $and: [
    {$or: [{key1: value1}, {key2: value2}]},
    {$or: [{key3: value1}, {key4: value2}]},
  ]
});
//find users whose nickename is Island Coder or Mary and whose score is 90 or 76
db.users.find({
  $and: [
    {$or: [{nickname: 'island coder'}, {nickname: 'Mary'}]},
    {$or: [{score: 90}, {score: 76}]}
  ]
});
//find users whose nickname is island coder and score is 90, or whose nickname is Mary and score is 76
db.users.find({
  $or: [
    {$and: [{nickname: 'island coder'}, {score: 90}]},
    {$and: [{nickname: 'Mary'}, {score: 76}]}
  ]
});
//find users whose nickname is island coder and whose score is not lower than 80
db.users.find({
  $and: [
    {nickname: 'island coder'},
    {score: {$not:{$lt: 80}}
  ]
});


比較演算子

MongoDB では以下の比較演算子が提供されており、 {key: {$op: value}} のような形式になっています。

  • eq: 等号演算子、すなわち a == b。
  • gt: より大きい、すなわち a > b。
  • gte: 大なり小なり、すなわち a > = b。
  • lt: 以下、すなわち a < b.
  • lte: 以下、すなわち a < = b.

INクエリ

inクエリのフォーマットは、対応する値が配列であること以外は、比較演算子と同様である、すなわち

db.collection.find({key: {$in: [...]}}) ;


例えば、スコアが90のユーザーを探すには、76。

db.users.find({score: {$in: [76, 90]}});


inクエリは、andクエリなど他の条件と組み合わせることも可能です。

db.users.find({
 $and: [
   {score: {$in: [76, 90]}},
   {gender: 'male'}
   ]
});


返される結果の数を制限し、データをスキップする

findメソッドは条件に一致するすべてのデータを見つけるので、データセットが大きい場合、非常に遅くなり、多くのディスクI/Oが発生することがあります。

// Find n pieces of data for the document with the specified criteria
db.collection.find({key: value}).limit(n);
// example: query more than 80 points of the three users
db.users.find({score: {$gt: 80}}).limit(3);
// find the specified conditions of the document, skipping the first n data
db.collection.find({key: value}).skip(n);
//example: query users with more than 80 points, skip the first 3
db.users.find({score: {$gt: 80}}).skip(3);


並び替え

ソートには以下の形式を使用しています。

db.collection.find({condition}).sort({key: 1});


ここで、1は昇順、-1は降順を意味します。例えば、分数の降順でソートする必要があります。

db.users.find().sort({score: -1});


概要

今回は、MongoDBの条件付きクエリ操作、返される項目の制限、ソートについて紹介します。ご覧のとおり、MongoDB の操作は SQL とは異なる構文ですが、どれも対応する関数があり、クエリを支援するのに便利です。

以上、MongoDBの条件付きクエリーとソートについて詳しく説明しました。MongoDBの条件付きクエリーとソートについては、スクリプトハウスの他の関連記事も参考にしてみてください