単純なクエリを使ってMongoDBのドキュメントをフィルタリングする方法
$match演算子によるドキュメントのフィルタリング
MongoDBで単純なクエリを使ってドキュメントをフィルタリングするには、集計パイプライン(aggregate)の中で$match演算子を使用します。$matchは、指定された条件に一致するドキュメントだけを次のパイプラインステージへ通過させる役割を持つステージです。
まずは、ドキュメントを含むコレクションを作成してみましょう。
> db.demo629.insertOne(
... {
... "Subject": [
... "MySQL",
... "MongoDB"
... ],
... "details": [
... {
... Name:"Chris",
... "Marks":78
... },
... { Name:"David",
... "Marks":89
... }
... ]
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5e9ae9f56c954c74be91e6b9")
}
コレクション内の全ドキュメントを確認する
find()メソッドを使うと、コレクション内のすべてのドキュメントを表示できます。
> db.demo629.find();
上記のコードを実行すると、次のような出力が得られます。
{ "_id" : ObjectId("5e9ae9f56c954c74be91e6b9"), "Subject" : [ "MySQL", "MongoDB" ], "details" : [ { "Name" : "Chris", "Marks" : 78 }, { "Name" : "David", "Marks" : 89 } ] }単純なクエリでドキュメントをフィルタリングする
以下が、単純なクエリを使用してMongoDBのドキュメントをフィルタリングする例です。
> db.demo629.aggregate([
... {"$unwind": "$details"},
... {"$match": {"details.Name": 'Chris', "Subject": {"$in":["Java","MySQL","Python","C","C++"]}}},
... {"$project": {"details": 1, "_id": 0}}
... ]);
このクエリでは、まず$unwindでdetails配列を個々のドキュメントに展開し、続く$matchで「details.NameがChrisである」かつ「SubjectがJava・MySQL・Python・C・C++のいずれかに該当する」ドキュメントのみを絞り込んでいます。最後に$projectで_idを除外し、detailsフィールドだけを出力しています。
このクエリを実行すると、次のような結果が出力されます。
{ "details" : { "Name" : "Chris", "Marks" : 78 } }このように、$matchを中心とした集計パイプラインを組み合わせることで、配列内の要素も柔軟に条件指定してフィルタリングすることが可能です。
-
MongoDBでネストしたサブドキュメントをフィルタリングする方法(aggregateと$unwind活用)
MongoDBでは、配列の中にさらに配列(サブドキュメント)がネストしている構造を持つドキュメントから、特定の条件に合致する要素だけを抽出したいケースがあります。このような場合、aggregate()メソッドと$unwind演算子を組み合わせることで実現できます。本記事では、実際のコード例を使いながら、ネストしたサブドキュメントのフィルタリング手順を解説します。サンプルコレクションの作成まず、ネストしたサブドキュメントを含むドキュメントを挿入して、コレクションを作成しましょう。> db.demo583.insert([ ... { ... details1 : [
-
MongoDBのaggregate()で3階層にネストされた埋め込みドキュメントの配列をフィルタリングする方法
MongoDBでネストされた配列をフィルタリングする基本アプローチMongoDBで3階層にネストされた埋め込みドキュメントの配列をフィルタリングするには、aggregate()メソッドを使用します。集計パイプラインの中で$unwindによって配列を展開し、$matchで条件に一致するドキュメントを絞り込むのが基本的な流れです。この記事では、実際のコード例を通じて具体的な手順を解説します。1. サンプルコレクションの作成まずは動作確認用のコレクションを作成し、ドキュメントを挿入してみましょう。> db.demo736.insertOne( ... { ... _id: