Learn the "why" behind slow queries and how to fix them in our 2-Part Webinar.
Register now >
Docs Menu
Docs Home
/ /

$and(クエリ述語演算子)

$and

$and では、1つ以上の式の配列で論理的な AND 操作を実行し、すべての式を満たすドキュメントを選択します。

注意

MongoDB では、カンマで区切られた式のリストを指定するときに暗黙的な AND 操作を提供します。

次の環境でホストされる配置には $and を使用できます。

  • MongoDB Atlas はクラウドでの MongoDB 配置のためのフルマネージド サービスです

  • MongoDB Enterprise: サブスクリプションベースの自己管理型 MongoDB バージョン

  • MongoDB Community: ソースが利用可能で、無料で使用できる自己管理型の MongoDB のバージョン

$andの構文は次のとおりです。

{ $and: [ { <expression1> }, { <expression2> } , ... , { <expressionN> } ] }

MongoDB のクエリ オプティマイザでは、$and 式の句を評価する際に、実行に最適なプランを選択するために、$and 式の句を満たすのにどのインデックスを役立てることができるのかが検討されます。

クエリ エンジンでクエリが最適化されるよう、$and はエラーを次のように処理します。

  • $and に指定した式が単独で評価されるとエラーが発生する場合、その式を含む $and でエラーが発生することがありますが、必ずしもエラーが発生するわけではありません。

  • $and に最初に指定した式の後に式を指定すると、最初の式が false と評価されていてもエラーが発生することがあります。

たとえば、次のクエリでは、 $x0 の場合、常にエラーが発生します。

db.example.find( {
$expr: { $eq: [ { $divide: [ 1, "$x" ] }, 3 ] }
} )

$and に複数の式を指定した次のクエリでは、$x0 であるドキュメントがある場合にエラーが発生することがあります

db.example.find( {
$and: [
{ x: { $ne: 0 } },
{ $expr: { $eq: [ { $divide: [ 1, "$x" ] }, 3 ] } }
]
} )

MongoDB Shell( mongosh)を含むほとんどのプログラミング言語とドライバーでは、同じオブジェクトレベルで重複キーを持つオブジェクトの構築は許可されていません。例、{ $ne: "R", $ne: "PG" } のように条件を指定すると、2 番目の値が最初の値を上書きします。

複数の条件を確認するには、明示的な AND を使用します。

db.movies.find( {
$and: [
{ genres: { $in: [ "News", "Talk-Show" ] } },
{ genres: { $in: [ "History", "Western" ] } }
]},
{ title: 1, genres: 1, year: 1 }
)

前のクエリは、両方の条件が満たされていることを明示的にチェックします。 配列には、各 セットから少なくとも 1genres$in つの値が含まれている必要があります。

このページの例では、sample_mflixサンプルデータセットのデータを使用します。このデータセットを自己管理型MongoDB配置にロードする方法の詳細については、サンプルデータセットをロードする を参照してください。サンプルデータベースに変更を加えた場合、このページの例を実行するには、データベースを削除して再作成する必要がある場合があります。

$and は、同じフィールドで複数の 式 と一致します。

次のクエリを考えてみましょう。

db.movies.find(
{ $and: [ { year: { $gte: 1960 } }, { year: { $lte: 1970 } }, { directors: "Martin Scorsese" } ] },
{ title: 1, directors: 1, year: 1 })

クエリは、次の条件を満たす movies コレクション内のすべてのドキュメントを選択します。

  • year1960が 以降で、かつ

  • year1970が またはそれ以前である、

  • directors には マーテン・スコアセット が含まれます

また、titledirectorsyear フィールドのみを含むように結果をプロジェクションします。このクエリでは次のドキュメントが返されます。

[
{
"_id": "573a1395f29313caabce2f95",
"title": "The Big Shave",
"directors": [ "Martin Scorsese" ],
"year": 1968
},
{
"_id": "573a1396f29313caabce3889",
"title": "Who's That Knocking at My Door",
"directors": [ "Martin Scorsese" ],
"year": 1967
}
]

このクエリを簡素化するには、yearフィールドの演算子を 1 つの クエリオブジェクトに組み合わせ、暗黙的な AND 演算子を使用します。

db.movies.find(
{ year: { $gte:1960, $lte:1970 }, directors:'Martin Scorsese' },
{ title: 1, directors: 1, year: 1 })

常にクエリを確認して、意図した動作と一致していることを確認してください。以前の genres の例を使用する場合は、次のようになります。

db.movies.find( { genres: { $in: [ "News", "Talk-Show" ], $in: [ "History", "Western" ] } } )

配列にgenres NewsまたはTalk-Show のいずれかが含まれ、かつ または のいずれかが含まれているドキュメントを検索するには、History Western$inを使用します。

db.movies.find( {
$and: [
{ genres: { $in: [ "News", "Talk-Show" ] } },
{ genres: { $in: [ "History", "Western" ] } }
]},
{ title: 1, genres: 1, year: 1 }
)

フィールドがdirectors: [ "Jack Conway", "Howard Hawks", "William A. Wellman" ] などの配列で、ドキュメントに1 つの値ではなく複数の値が含まれているかどうかを確認する場合は、$all を使用します。

db.movies.find( { directors: { $all: ['John Murray Anderson','Pèl Fejès'] } }, { title: 1, directors: 1, year: 1 })

前のクエリは意味的に AND と同じですが、配列フィールドをクエリする場合は $all がより明確です。

フィールド名の重複と同様に、クエリで使用される演算子の重複にも同様の考慮が適用されます。

戻る

論理

項目一覧