MongoDBで複数フィールドのフィルター条件を組み合わせてコレクション内のドキュメントを検索する方法
MongoDBで複数のフィールドを組み合わせた条件(フィルター)を使ってコレクション内のドキュメントを検索したい場合、$or演算子とfind()メソッドを組み合わせるのが基本です。$orは、配列として渡した複数の条件のうちいずれか1つでも一致すればそのドキュメントを返す論理演算子です。
本記事では、実際にサンプルデータを作成しながら、具体的な手順と実行結果をわかりやすく解説します。
サンプルコレクションの作成
まず、insertOne()メソッドを使ってテスト用のコレクションに4件のドキュメントを挿入します。各ドキュメントには「ClientName」(顧客名)と「IsMarried」(結婚の有無)という2つのフィールドを持たせます。
> db.findDocumentWithFilterDemo.insertOne({"ClientName":"Robert","IsMarried":false});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd4fd1e2cba06f46efe9ef1")
}
> db.findDocumentWithFilterDemo.insertOne({"ClientName":"Chris","IsMarried":true});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd4fd322cba06f46efe9ef2")
}
> db.findDocumentWithFilterDemo.insertOne({"ClientName":"David","IsMarried":true});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd4fd3b2cba06f46efe9ef3")
}
> db.findDocumentWithFilterDemo.insertOne({"ClientName":"Carol","IsMarried":true});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd4fd452cba06f46efe9ef4")
}
コレクション内の全ドキュメントを確認する
続いて、find()メソッドにpretty()を組み合わせて呼び出すと、コレクション内のすべてのドキュメントを整形された読みやすい形式で表示できます。
> db.findDocumentWithFilterDemo.find().pretty();
上記クエリを実行すると、以下のような出力が得られます。
{
"_id" : ObjectId("5cd4fd1e2cba06f46efe9ef1"),
"ClientName" : "Robert",
"IsMarried" : false
}
{
"_id" : ObjectId("5cd4fd322cba06f46efe9ef2"),
"ClientName" : "Chris",
"IsMarried" : true
}
{
"_id" : ObjectId("5cd4fd3b2cba06f46efe9ef3"),
"ClientName" : "David",
"IsMarried" : true
}
{
"_id" : ObjectId("5cd4fd452cba06f46efe9ef4"),
"ClientName" : "Carol",
"IsMarried" : true
}
複数フィールドを組み合わせたフィルターでドキュメントを検索する
それでは本題です。次のクエリでは、$or演算子の中に2つの条件を配列で渡しています。
- 条件1:「ClientName」が「Robert」以外であること($ne演算子を使用)
- 条件2:「IsMarried」がfalse以外であること($ne演算子を使用)
$neは「not equal(〜と等しくない)」を意味する比較演算子です。$orによって、この2つの条件のどちらか一方でも満たしていれば、そのドキュメントが検索結果として返されます。
> db.findDocumentWithFilterDemo.find({ $or: [ { "ClientName": { $ne:"Robert" } }, { "IsMarried": { $ne: false } } ] } );
実行すると、以下の3件のドキュメントが出力されます。「Robert」はClientNameが「Robert」であり、かつIsMarriedがfalseのため両方の条件を満たせず除外され、残りの3件が一致しています。
{ "_id" : ObjectId("5cd4fd322cba06f46efe9ef2"), "ClientName" : "Chris", "IsMarried" : true }
{ "_id" : ObjectId("5cd4fd3b2cba06f46efe9ef3"), "ClientName" : "David", "IsMarried" : true }
{ "_id" : ObjectId("5cd4fd452cba06f46efe9ef4"), "ClientName" : "Carol", "IsMarried" : true }
まとめ
複数フィールドの条件を組み合わせてMongoDBのドキュメントを検索する場合は、$or演算子(または$and演算子)とfind()メソッドを組み合わせます。特定の値と等しくないドキュメントで絞り込みたいときは$ne演算子が便利です。なお、すべての条件を同時に満たすドキュメント(AND条件)を取得したい場合は、$and演算子を使うか、クエリオブジェクトに複数のフィールドを直接並べて記述します。用途に応じてこれらの演算子を使い分けることで、柔軟なデータ検索が可能になります。
-
MongoDBで複数ドキュメントを国・州・都市ごとに集計する方法
MongoDBの集計(アグリゲーション)操作は、複数のドキュメントから値をグループ化し、そのグループ化されたデータに対してさまざまな処理を実行して、単一の結果を返すための強力な機能です。本記事では、aggregate()メソッドと$groupステージを組み合わせて、コレクション内のドキュメントを「国 → 州 → 都市」の階層構造で集計する手順を解説します。1. サンプルコレクションの作成まずは動作確認用のコレクションを作成しましょう。insertOne()メソッドを使って、国・都市・州の情報を持つドキュメントを3件登録します。> db.demo620.insertOne({Country
-
MongoDBの集計パイプラインで複数フィールドをカウントする方法($facet活用)
MongoDBで複数のフィールドごとにドキュメントをカウントしたい場合、$facet演算子を使うのが効果的です。$facetは、同じ入力ドキュメント群に対して、単一のステージ内で複数の集計パイプラインを同時に処理できる強力な機能です。この記事では、実際にコレクションを作成し、$facetを組み合わせた集計クエリで複数フィールドの値をカウントする手順を解説します。1. サンプルコレクションの作成まず、insertOne()メソッドを使ってサンプルドキュメントを挿入します。各ドキュメントにはdetails1・details2・details3という3つのネストされたフィールドを持たせます。>