MongoDB ドキュメントのクエリ
MongoDB のドキュメントクエリではfind()、findOne()メソッドを使用します。
find() メソッドは非構造化形式で全てのドキュメントを表示します。
構文
MongoDB でデータを照会する構文形式は次のとおりです。
db.collection.find(query, projection)
- query: ドキュメントを検索するためのクエリ条件。デフォルトは
{}、つまりすべてのドキュメントに一致します。 - projection(オプション):返される結果に含める、または除外するフィールドを指定します。
すべてのドキュメントを検索する:
例
条件に基づいてドキュメントを検索する:
例
条件に基づいてドキュメントを検索し、指定したフィールドのみ返す:
例
{ age: { $gt: 25 } },
{ name: 1, age: 1, _id: 0 }
);
読みやすい形式でデータを読み取る必要がある場合は、pretty() メソッドを使用できます。構文形式は次のとおりです。
>db.col.find().pretty()
pretty() メソッドは、フォーマットされた形式で全てのドキュメントを表示します。
例
{
"_id" : ObjectId("56063f17ade2f21f36b03133"),
"title" : "MongoDB 教程",
"description" : MongoDB は NoSQL データベースです。,
"by" : "サンプル",
"url" : "http://www.example.com",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : 100
}
2、findOne()
findOne() メソッドは、コレクション内の単一のドキュメントを検索するために使用されます。一致するドキュメントが複数見つかった場合、最初のドキュメントのみ返します。
構文:
db.collection.findOne(query, projection)
- query: ドキュメントを検索するためのクエリ条件。デフォルトは
{}、つまりすべてのドキュメントに一致します。 - projection(オプション):返される結果に含める、または除外するフィールドを指定します。
単一のドキュメントを検索する:
db.myCollection.findOne({ name: "Alice" });単一のドキュメントを検索し、指定したフィールドのみ返す:
db.myCollection.findOne(
{ name: "Alice" },
{ name: 1, age: 1, _id: 0 }
);
高度なクエリメソッド
1、比較演算子を使用する
MongoDB は多くの比較演算子をサポートしています。例えば$gt、$lt、$gte、$lte、$eq、$neなどです。
年齢が 25 より大きいドキュメントを検索:
db.myCollection.find({ age: { $gt: 25 } });
2、論理演算子を使用する
MongoDB は多くの論理演算子をサポートしています。例えば$and、$or、$not、$norなどです。
年齢が 25 より大きく、都市が "New York" のドキュメントを検索:
例
$and: [
{ age: { $gt: 25 } },
{ city: "New York" }
]
});
3、正規表現を使用する
正規表現を使用してパターンマッチングのクエリを実行できます。
名前が "A" で始まるドキュメントを検索:
db.myCollection.find({ name: /^A/ });
4、プロジェクション
プロジェクションは、クエリ結果で返されるフィールドを制御するために使用されます。フィールドを含める方式と除外する方式の2つがあります。
名前と年齢フィールドのみ返す:
例
{ age: { $gt: 25 } },
{ name: 1, age: 1, _id: 0 }
);
5、並べ替え
クエリ結果を並べ替えることができます。
年齢の降順で並べ替え:
db.myCollection.find().sort({ age: -1 });
6、制限とスキップ
クエリ結果に対して、ドキュメント数の制限や指定した数のスキップを行うことができます。
最初の 10 件のドキュメントを返す:
db.myCollection.find().limit(10);
最初の 5 件のドキュメントをスキップし、次の 10 件のドキュメントを返す:
db.myCollection.find().skip(5).limit(10);
例
年齢が 25 より大きく、都市が "New York" のドキュメントを検索し、名前と年齢フィールドのみ返し、年齢の降順で並べ替え、最初の 10 件のドキュメントを返します。
例
{
$and: [
{ age: { $gt: 25 } },
{ city: "New York" }
]
},
{ name: 1, age: 1, _id: 0 }
).sort({ age: -1 }).limit(10);
MongoDB と RDBMS の Where ステートメントの比較
通常の SQL データに精通している場合、次の表を通じて MongoDB の条件ステートメントのクエリをよりよく理解できます。
| 操作 | 形式 | 例 | RDBMS での類似ステートメント |
|---|---|---|---|
| 等しい | {<key>:<value>} |
db.col.find({"by":"サンプル"}).pretty() |
where by = 'サンプル' |
| 小なり | {<key>:{$lt:<value>}} |
db.col.find({"likes":{$lt:50}}).pretty() |
where likes < 50 |
| 小なりイコール | {<key>:{$lte:<value>}} |
db.col.find({"likes":{$lte:50}}).pretty() |
where likes <= 50 |
| 大なり | {<key>:{$gt:<value>}} |
db.col.find({"likes":{$gt:50}}).pretty() |
where likes > 50 |
| 大なりイコール | {<key>:{$gte:<value>}} |
db.col.find({"likes":{$gte:50}}).pretty() |
where likes >= 50 |
| 等しくない | {<key>:{$ne:<value>}} |
db.col.find({"likes":{$ne:50}}).pretty() |
where likes != 50 |
MongoDB の AND 条件
MongoDB の find() メソッドは複数のキーを渡すことができ、各キーはカンマで区切られます。つまり通常の SQL の AND 条件です。
構文形式は次のとおりです。
>db.col.find({key1:value1, key2:value2}).pretty()
例
次の例では、byとtitleキーを使用してサンプル 中 MongoDB 教程のデータをクエリします。
> db.col.find({"by":"サンプル", "title":"MongoDB 教程"}).pretty()
{
"_id" : ObjectId("56063f17ade2f21f36b03133"),
"title" : "MongoDB 教程",
"description" : "MongoDB 是一个 Nosql 数据库",
"by" : "サンプル",
"url" : "http://www.example.com",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : 100
}
上記の例は WHERE ステートメントに類似しています:WHERE by='サンプル' AND title='MongoDB 教程'
MongoDB の OR 条件
MongoDB の OR 条件ステートメントではキーワードを使用し、$or構文形式は次のとおりです。
>db.col.find(
{
$or: [
{key1: value1}, {key2:value2}
]
}
).pretty()
例
次の例では、キーbyの値がサンプルまたはキーtitleの値がMongoDB 教程のドキュメントをクエリすることを示します。
>db.col.find({$or:[{"by":"サンプル"},{"title": "MongoDB 教程"}]}).pretty()
{
"_id" : ObjectId("56063f17ade2f21f36b03133"),
"title" : "MongoDB 教程",
"description" : "MongoDB 是一个 Nosql 数据库",
"by" : "サンプル",
"url" : "http://www.example.com",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : 100
}
>
AND と OR の組み合わせ使用
次の例では、AND と OR の併用を示しています。対応する通常の SQL ステートメントは次のとおりです。'where likes>50 AND (by = 'サンプル' OR title = 'MongoDB 教程')'
>db.col.find({"likes": {$gt:50}, $or: [{"by": "サンプル"},{"title": "MongoDB 教程"}]}).pretty()
{
"_id" : ObjectId("56063f17ade2f21f36b03133"),
"title" : "MongoDB 教程",
"description" : "MongoDB 是一个 Nosql 数据库",
"by" : "サンプル",
"url" : "http://www.example.com",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : 100
}
その他の拡張