MongoDBで配列サイズが1より大きいドキュメントをクエリする方法
MongoDBでは、$where演算子とJavaScriptのlengthプロパティを組み合わせることで、配列のサイズが1より大きい(要素が2つ以上含まれる)ドキュメントを簡単に検索できます。
基本構文
以下の構文を使用して、配列サイズが1より大きいドキュメントをクエリします。
db.yourCollectionName.find({$where:"this.yourArrayDocumentName.length > 1"}).pretty();サンプルコレクションの作成
上記の構文を理解するために、まずいくつかのドキュメントを含むコレクションを作成しましょう。以下のクエリでコレクションにドキュメントを挿入します。
> db.arrayLengthGreaterThanOne.insertOne({"StudentName":"Larry","StudentTechnicalSubject":["Java","C","C++"]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c6d6c4c0c3d5054b766a76a")
}
> db.arrayLengthGreaterThanOne.insertOne({"StudentName":"Maxwell","StudentTechnicalSubject":["MongoDB"]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c6d6c660c3d5054b766a76b")
}
> db.arrayLengthGreaterThanOne.insertOne({"StudentName":"Maxwell","StudentTechnicalSubject":["MySQL","SQL Server","PL/SQL"]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c6d6c800c3d5054b766a76c")
}この例では、学生名(StudentName)と履修している技術科目(StudentTechnicalSubject)の配列を持つドキュメントを3件挿入しました。1件目は3つの科目、2件目は1つの科目、3件目は3つの科目を含んでいます。
全ドキュメントの表示
find()メソッドを使って、コレクション内のすべてのドキュメントを表示します。
> db.arrayLengthGreaterThanOne.find().pretty();
実行結果は以下の通りです。
{
"_id" : ObjectId("5c6d6c4c0c3d5054b766a76a"),
"StudentName" : "Larry",
"StudentTechnicalSubject" : [
"Java",
"C",
"C++"
]
}
{
"_id" : ObjectId("5c6d6c660c3d5054b766a76b"),
"StudentName" : "Maxwell",
"StudentTechnicalSubject" : [
"MongoDB"
]
}
{
"_id" : ObjectId("5c6d6c800c3d5054b766a76c"),
"StudentName" : "Maxwell",
"StudentTechnicalSubject" : [
"MySQL",
"SQL Server",
"PL/SQL"
]
}配列サイズが1より大きいドキュメントを取得するクエリ
それでは、配列サイズが1より大きいドキュメントを抽出するクエリを実行してみましょう。以下のクエリは、配列に2つ以上の要素が含まれるすべてのドキュメントを返します。
> db.arrayLengthGreaterThanOne.find({$where:"this.StudentTechnicalSubject.length > 1"}).pretty();実行結果は以下の通りです。
{
"_id" : ObjectId("5c6d6c4c0c3d5054b766a76a"),
"StudentName" : "Larry",
"StudentTechnicalSubject" : [
"Java",
"C",
"C++"
]
}
{
"_id" : ObjectId("5c6d6c800c3d5054b766a76c"),
"StudentName" : "Maxwell",
"StudentTechnicalSubject" : [
"MySQL",
"SQL Server",
"PL/SQL"
]
}結果を見ると、要素が1つしかない「Maxwell」の「MongoDB」のみのドキュメントは除外され、配列サイズが2以上の2件のドキュメントだけが返されていることがわかります。
補足:$expr演算子を使った代替方法
MongoDB 3.6以降では、$whereの代わりに$exprと集計演算子の$gt・$sizeを組み合わせる方法も利用できます。
db.arrayLengthGreaterThanOne.find({
$expr: { $gt: [ { $size: "$StudentTechnicalSubject" }, 1 ] }
}).pretty();$expr方式はインデックスを活用でき、パフォーマンス面で有利な場合があるため、新しいバージョンのMongoDBを使用している場合はこちらの方法も検討するとよいでしょう。
-
MongoDBで埋め込みドキュメントの配列をクエリし、新しいドキュメントをプッシュする方法
MongoDBで埋め込みドキュメントの配列に対してクエリを実行し、条件を満たす場合にのみ新しいドキュメントを追加したい場合は、updateメソッドと$push演算子を組み合わせて使用します。ここでは、実際のサンプルコードを使って手順を詳しく解説します。 手順1:サンプルコレクションの作成 まず、insertOne()メソッドを使って、埋め込みドキュメントの配列を含むドキュメントを作成しましょう。 > db.demo573.insertOne( ... { ... _id :101, ... SearchInformation : [ ...
-
$elemMatch演算子を使った配列フィールドを持つドキュメントの検索方法【MongoDB】
MongoDBで配列フィールド内の要素に基づいてドキュメントを検索したい場合、$elemMatch 演算子を使用します。$elemMatch を使うことで、配列内の同一の要素に対して複数の条件を同時に適用できるのが大きな特徴です。この記事では、実際にコレクションを作成し、配列フィールドを含むドキュメントを $elemMatch で照合する手順を解説します。1. テスト用コレクションの作成まず、配列フィールド details を持つドキュメントを挿入して、サンプルコレクションを作成しましょう。> db.demo592.insertOne( ... { ... id:1