MongoDBでコレクション内のオブジェクトの配列を検索する方法
MongoDBでオブジェクトの配列を検索するには、find()メソッドを使用します。find()メソッドは、コレクションやビューから条件に一致するドキュメントを選択し、その結果へのカーソルを返します。
サンプルコレクションの作成
まず、ドキュメントを含むコレクションを作成しましょう。ここでは「demo484」というコレクションに、detailsフィールドとしてオブジェクトの配列を持つドキュメントを3件挿入します。
> db.demo484.insertOne(
... { 'id' : 1, 'details' : [ { 'Name1' : 'Chris' }, { 'Name2' : 'David' }, { 'Name3' : 'Bob' } ] }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5e82e3a4b0f3fa88e22790a1")
}
> db.demo484.insertOne(
... { 'id' : 1, 'details' : [ { 'Name1' : 'Chris' }, { 'Name2' : 'Carol' }, { 'Name3' : 'Bob' } ] }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5e82e3a4b0f3fa88e22790a2")
}
> db.demo484.insertOne(
... { 'id' : 1, 'details' : [ { 'Name1' : 'Chris' }, { 'Name2' : 'Carol' }, { 'Name3' : 'Mike' } ] }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5e82e3a4b0f3fa88e22790a3")
}
登録されたドキュメントの確認
find()メソッドを使うと、コレクション内のすべてのドキュメントを表示できます。
> db.demo484.find();
このクエリを実行すると、以下のような出力が得られます。
{ "_id" : ObjectId("5e82e3a4b0f3fa88e22790a1"), "id" : 1, "details" : [ { "Name1" : "Chris" }, {
"Name2" : "David" }, { "Name3" : "Bob" } ] }
{ "_id" : ObjectId("5e82e3a4b0f3fa88e22790a2"), "id" : 1, "details" : [ { "Name1" : "Chris" }, {
"Name2" : "Carol" }, { "Name3" : "Bob" } ] }
{ "_id" : ObjectId("5e82e3a4b0f3fa88e22790a3"), "id" : 1, "details" : [ { "Name1" : "Chris" }, {
"Name2" : "Carol" }, { "Name3" : "Mike" } ] }
オブジェクト配列を検索するクエリ
MongoDBのコレクション内にあるオブジェクトの配列を検索するには、ドット表記(例:details.Name2)で配列内のフィールドを指定し、複数の条件を組み合わせる場合は$or演算子を使用します。
以下は、「Name2がCarol」かつ「Name3がMike」、または「Name2がCarol」かつ「Name3がBob」であるドキュメントを検索するクエリです。
> db.demo484.find(
... {$or: [
... {'details.Name2': 'Carol', 'details.Name3': 'Mike'},
... {'details.Name2': 'Carol', 'details.Name3': 'Bob'}
... ]}
... )
このクエリを実行すると、以下の出力が得られます。
{ "_id" : ObjectId("5e82e3a4b0f3fa88e22790a2"), "id" : 1, "details" : [ { "Name1" : "Chris" }, {
"Name2" : "Carol" }, { "Name3" : "Bob" } ] }
{ "_id" : ObjectId("5e82e3a4b0f3fa88e22790a3"), "id" : 1, "details" : [ { "Name1" : "Chris" }, {
"Name2" : "Carol" }, { "Name3" : "Mike" } ] }
ポイント解説
- ドット表記:配列内のオブジェクトのフィールドにアクセスするには、
'details.Name2'のように記述します。MongoDBは自動的に配列内の各要素を順にチェックし、条件に一致するドキュメントを抽出します。 - $or演算子:複数の条件のいずれかに一致するドキュメントを取得したい場合に使用します。各条件ブロック内でカンマ区切りで指定した条件はANDとして扱われるため、「Name2がCarolかつName3がMike」といった組み合わせ条件を柔軟に定義できます。
- 検索結果:上記の例では、Name2が「David」である最初のドキュメントが除外され、条件に合致する残り2件のドキュメントだけが結果として返されています。
-
MongoDBで配列の値を使ってコレクションを並べ替える方法
MongoDBのコレクションを配列の値を基準にソートしたい場合は、aggregate()メソッドと $sort ステージを組み合わせて使用します。さらに、配列を個々のドキュメントに分解するために $unwind も活用します。 サンプルコレクションの作成 まず、ドキュメントを含むコレクションを作成しましょう。ここでは、学生ごとの詳細情報(名前とスコア)を配列として持つドキュメントを挿入します。 > db.demo577.insertOne( ... { ... student: { ... details: [ ... { .
-
MongoDBでコレクションから配列フィールド全体を削除するクエリの書き方
MongoDBで配列フィールドを完全に削除するにはMongoDBのコレクションから、ドキュメント内の配列フィールドそのもの(フィールドごと)を取り除きたい場合は、更新演算子の $unset を使用します。$unset は指定したフィールドをドキュメントから削除する演算子で、配列の中身だけを空にするのではなく、フィールド自体が存在しない状態にできます。ここでは、サンプルコレクションを作成して、実際に配列フィールドを削除する手順を見ていきましょう。1. サンプルコレクションの作成まず、insertOne() メソッドを使ってドキュメントを挿入し、テスト用のコレクション demo609 を作成します