MongoDBのfindクエリで配列内の値を取得する方法【ドット表記の基本】
MongoDBのfindクエリで配列内の値を取得する方法
MongoDBでは、配列の中に格納されたサブドキュメント(ネストされたオブジェクト)の値を取得する際に、ドット(.)表記を使用します。この記事では、実際のコード例を通して、配列フィールドへのクエリの書き方を順番に解説します。
1. サンプルコレクションの作成
まず、insertOne()メソッドを使って、配列フィールドを含むドキュメントを挿入し、テスト用のコレクションを作成します。
> db.retrievingArrayDemo.insertOne(
{ "UserDetails" : [
{ "UserName" : "John", "UserAge" : 23 } ],
"UserCountryName" : "AUS",
"UserLoginDate" : new ISODate(),
"UserMessage" : "Hello"
}
);
{
"acknowledged" : true,
"insertedId" : ObjectId("5ce9718478f00858fb12e920")
}
> db.retrievingArrayDemo.insertOne(
{ "UserDetails" : [
{ "UserName" : "Sam", "UserAge" : 24 } ],
"UserCountryName" : "UK",
"UserLoginDate" : new ISODate(),
"UserMessage" : "Bye"
}
);
{
"acknowledged" : true,
"insertedId" : ObjectId("5ce9718478f00858fb12e921")
}上記の例では、「UserDetails」という配列フィールドの中に、ユーザー名(UserName)と年齢(UserAge)を持つオブジェクトが格納されています。このようなネスト構造を持つドキュメントが2件登録されました。
2. コレクション内の全ドキュメントを確認する
find()メソッドに.pretty()を組み合わせると、登録済みの全ドキュメントを整形された読みやすい形式で表示できます。
> db.retrievingArrayDemo.find().pretty();
実行すると、以下のような出力が得られます。
{
"_id" : ObjectId("5ce9718478f00858fb12e920"),
"UserDetails" : [
{
"UserName" : "John",
"UserAge" : 23
}
],
"UserCountryName" : "AUS",
"UserLoginDate" : ISODate("2019-05-25T16:47:00.211Z"),
"UserMessage" : "Hello"
}
{
"_id" : ObjectId("5ce9718478f00858fb12e921"),
"UserDetails" : [
{
"UserName" : "Sam",
"UserAge" : 24
}
],
"UserCountryName" : "UK",
"UserLoginDate" : ISODate("2019-05-25T16:47:00.670Z"),
"UserMessage" : "Bye"
}3. ドット表記で配列内の値を条件に検索する
ここが本題です。配列内のフィールドを検索条件に指定するには、「UserDetails.UserName」のように「配列フィールド名.プロパティ名」という形式でドット表記を記述します。
次のクエリは、「UserCountryNameがUK」かつ「配列内のUserNameがSam」という2つの条件に一致するドキュメントを取得します。
> db.retrievingArrayDemo.find({"UserCountryName" : "UK", "UserDetails.UserName":"Sam"}).pretty();実行結果は以下の通りです。条件に合致した1件のドキュメントのみが返されました。
{
"_id" : ObjectId("5ce9718478f00858fb12e921"),
"UserDetails" : [
{
"UserName" : "Sam",
"UserAge" : 24
}
],
"UserCountryName" : "UK",
"UserLoginDate" : ISODate("2019-05-25T16:47:00.670Z"),
"UserMessage" : "Bye"
}ポイントまとめ
- 配列内のサブドキュメントのフィールドには、ドット(.)表記でアクセスできます
- 記述形式は「親フィールド名.子フィールド名」(例:UserDetails.UserName)
- 複数の条件を組み合わせる場合は、find()の第一引数にカンマ区切りで指定します
- .pretty()メソッドを使うと、クエリ結果を見やすく整形して表示できます
-
【MongoDB】配列内の値を指定して一致するドキュメントを検索するクエリ
$in演算子とは配列フィールドに複数の候補値のいずれかが含まれるドキュメントを検索したい場合、MongoDBでは$in演算子を使用します。まずは、サンプルとなるドキュメントを挿入してコレクションを作成してみましょう。> db.demo511.insertOne({ListOfProject:[Library Management System,Hospital Management System]}); { acknowledged : true, insertedId : ObjectId(5e88473a987b6e0e9d18f585) } > db.demo51
-
MongoDBでコレクションから配列フィールド全体を削除するクエリの書き方
MongoDBで配列フィールドを完全に削除するにはMongoDBのコレクションから、ドキュメント内の配列フィールドそのもの(フィールドごと)を取り除きたい場合は、更新演算子の $unset を使用します。$unset は指定したフィールドをドキュメントから削除する演算子で、配列の中身だけを空にするのではなく、フィールド自体が存在しない状態にできます。ここでは、サンプルコレクションを作成して、実際に配列フィールドを削除する手順を見ていきましょう。1. サンプルコレクションの作成まず、insertOne() メソッドを使ってドキュメントを挿入し、テスト用のコレクション demo609 を作成します