【MongoDB】クエリでドキュメント内の特定の配列要素を検索し、範囲条件でフィルタリングする方法
MongoDBのaggregate()で配列要素を検索し、範囲でフィルタリングする
配列の中から特定の条件に合う要素だけを取り出したい場合には、MongoDBのaggregate()メソッドが便利です。本記事では、$match・$addFields・$filterを組み合わせて、価格帯(範囲)で配列要素を絞り込む手順を解説します。
1. サンプルコレクションの作成
まずは、ドキュメントを含むコレクションを作成しましょう。
> db.demo351.insertOne(
... {
...
... "_id" : "101",
... "ProductDetails" : [
... {
... "ProductName" : "Product-1",
... "ProductPrice" :500
... },
... {
... "ProductName" : "Product-2",
... "ProductPrice" :400
... }
... ]
... }
... );
{ "acknowledged" : true, "insertedId" : "101" }
> db.demo351.insertOne(
... {
...
... "_id" : "102",
... "ProductDetails" : [
... {
... "ProductName" : "Product-3",
... "ProductPrice" :200
... },
... {
... "ProductName" : "Product-4",
... "ProductPrice" :800
... }
... ]
... }
... );
{ "acknowledged" : true, "insertedId" : "102" }
2. コレクション内の全ドキュメントを表示する
find()メソッドを使うと、コレクション内のすべてのドキュメントを確認できます。
> db.demo351.find();
実行すると、次のような出力が得られます。
{
"_id" : "101", "ProductDetails" : [
{ "ProductName" : "Product-1", "ProductPrice" : 500 },
{ "ProductName" : "Product-2", "ProductPrice" : 400 }
]
}
{
"_id" : "102", "ProductDetails" : [
{ "ProductName" : "Product-3", "ProductPrice" : 200 },
{ "ProductName" : "Product-4", "ProductPrice" : 800 }
]
}
3. 範囲条件で配列要素をフィルタリングするクエリ
以下は、クエリと範囲指定(600より大きく900より小さい)を使って、MongoDBドキュメント内の特定の配列要素を検索するサンプルです。
> db.demo351.aggregate([
... {
... $match: { _id: "102" }
... },
... {
... $addFields: {
... ProductDetails: {
... $filter: {
... input: "$ProductDetails",
... cond: {
... $and: [
... { $gt: [ "$$this.ProductPrice", 600 ] },
... { $lt: [ "$$this.ProductPrice", 900 ] }
... ]
... }
... }
... }
... }
... }
... ])
クエリのポイント
- $match: まず対象となるドキュメント(_id: "102")を絞り込みます。
- $addFields: 既存のProductDetailsフィールドを、フィルタリング後の結果で上書きします。
- $filter: 配列の各要素($$this)に対して条件を評価し、条件を満たす要素だけを残します。
- $and + $gt / $lt: ProductPriceが「600超 かつ 900未満」という範囲条件を指定しています。
実行結果
このクエリを実行すると、範囲条件に合致する要素のみが出力されます。
{ "_id" : "102", "ProductDetails" : [ { "ProductName" : "Product-4", "ProductPrice" : 800 } ] }
このように、aggregate()パイプラインと$filter演算子を活用すれば、配列内の要素を柔軟に検索・絞り込むことができます。価格帯以外にも、日付や文字列の条件など、さまざまな範囲フィルタリングに応用可能です。
-
特定のFirstNameとLastNameを持つドキュメントを検索するMongoDBクエリの書き方
はじめにMongoDBで特定のFirstNameとLastNameを持つドキュメントを検索するには、$and演算子と$in演算子を組み合わせて使用します。この記事では、実際のコード例を通して、find()メソッドでこの条件を実装する方法を解説します。サンプルコレクションの作成まず、insertOne()メソッドを使ってドキュメントを含むコレクションを作成しましょう。> db.demo692.insertOne({FirstName:"Chris","LastName":"Brown"}); { "acknowl
-
MongoDBのaggregate()で3階層にネストされた埋め込みドキュメントの配列をフィルタリングする方法
MongoDBでネストされた配列をフィルタリングする基本アプローチMongoDBで3階層にネストされた埋め込みドキュメントの配列をフィルタリングするには、aggregate()メソッドを使用します。集計パイプラインの中で$unwindによって配列を展開し、$matchで条件に一致するドキュメントを絞り込むのが基本的な流れです。この記事では、実際のコード例を通じて具体的な手順を解説します。1. サンプルコレクションの作成まずは動作確認用のコレクションを作成し、ドキュメントを挿入してみましょう。> db.demo736.insertOne( ... { ... _id: