【MongoDB】配列内に同じ値が複数回出現するドキュメントを検索するクエリの書き方
MongoDBで配列内に同じ値が複数回出現するドキュメントを検索する方法
MongoDBでは、$where演算子とJavaScriptのスクリプトを組み合わせることで、配列内に同じ値が複数回出現しているドキュメントを検索できます。ここでは、価格リストを含むコレクションを例に、「110」という価格が2回以上登場するドキュメントを抽出する手順を解説します。
サンプルコレクションの作成
まず、insertOne()メソッドを使用して、テスト用のドキュメントをコレクションに挿入します。
> db.sameValueMultipleTimesDemo.insertOne(
{
"ListOfPrice":[
{"Price": 110},
{"Price": 130},
{"Price": 145}
]
}
);
{
"acknowledged" : true,
"insertedId" : ObjectId("5cefc4e6ef71edecf6a1f6b9")
}
> db.sameValueMultipleTimesDemo.insertOne(
{
"ListOfPrice":[
{"Price": 110},
{"Price": 178},
{"Price": 110}
]
}
);
{
"acknowledged" : true,
"insertedId" : ObjectId("5cefc4e7ef71edecf6a1f6ba")
}登録済みドキュメントの確認
find()メソッドとpretty()を組み合わせることで、コレクション内のすべてのドキュメントを見やすい形式で表示できます。
> db.sameValueMultipleTimesDemo.find().pretty();
上記のクエリを実行すると、次のような出力が得られます。
{
"_id" : ObjectId("5cefc4e6ef71edecf6a1f6b9"),
"ListOfPrice" : [
{
"Price" : 110
},
{
"Price" : 130
},
{
"Price" : 145
}
]
}
{
"_id" : ObjectId("5cefc4e7ef71edecf6a1f6ba"),
"ListOfPrice" : [
{
"Price" : 110
},
{
"Price" : 178
},
{
"Price" : 110
}
]
}同じ値が複数回出現する配列を検索するクエリ
ここからが本題です。$where演算子の中でJavaScriptのfilter()メソッドを使用し、条件に一致する要素の数が1より大きいかどうかを判定します。
> db.sameValueMultipleTimesDemo.find({
"$where": function() {
return this.ListOfPrice.filter(function(p) {
return p.Price == 110;
}).length > 1;
}
})実行結果
このクエリを実行すると、価格「110」が2回出現している2番目のドキュメントのみが返されます。1番目のドキュメントは「110」が1回しか出現していないため、結果から除外されます。
{ "_id" : ObjectId("5cefc4e7ef71edecf6a1f6ba"), "ListOfPrice" : [ { "Price" : 110 }, { "Price" : 178 }, { "Price" : 110 } ] }注意点:$where演算子のパフォーマンス
$where演算子はサーバーサイドでJavaScriptを実行するため、インデックスを活用できず、大規模なコレクションでは処理速度が低下する可能性があります。本番環境での利用は必要最小限にとどめ、可能であれば集計フレームワーク($exprや$groupなど)を活用した代替手段を検討することをおすすめします。
-
【MongoDB】idがドキュメント内の配列フィールドの値と一致する場合に除外するクエリの書き方
MongoDBでは、ドキュメントの id フィールドの値が、同一ドキュメント内の配列型フィールド(例: subjectid)に含まれている場合に、そのドキュメントを検索結果から除外したいケースがあります。このような条件を実現するには、 $expr 演算子と組み合わせて $not および $in を使用します。本記事では、サンプルコレクションの作成からクエリの実行、出力結果の確認までを順を追って解説します。 サンプルコレクションの作成 まずは、動作確認用のドキュメントを含むコレクションを作成します。ここでは、 id フィールドと、文字列の配列を持つ subjectid フィールドを備えた2件のド
-
MongoDBで配列をクエリして特定の値を取得する方法
配列から特定の値を取得するには、aggregate()メソッドと$projectステージを組み合わせて使用します。まずは、ドキュメントを含むコレクションを作成してみましょう。 > db.demo761.insertOne( ... { ... "details": [ ... { ... "