MongoDBでキー名が不明なドキュメントを検索する方法($addFieldsと$objectToArrayの活用)
MongoDBでは、フィールド名(キー)が事前にわからない場合でも、集計パイプラインの $addFields と $objectToArray を組み合わせることでドキュメントを検索できます。この記事では、具体的な手順をサンプルコードとともに解説します。
1. サンプルコレクションの作成
まず、検索用のコレクションにドキュメントを挿入します。ここでは demo375 コレクションを作成し、details フィールドの中に Name と Age を持つ3件のドキュメントを登録します。
> db.demo375.insertOne(
... {
... "details":{
... "Name":"John",
... "Age":23
... }
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5e5a0ae42ae06a1609a00b06")
}
> db.demo375.insertOne(
... {
... "details":{
... "Name":"David",
... "Age":21
... }
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5e5a0ae42ae06a1609a00b07")
}
> db.demo375.insertOne(
... {
... "details":{
... "Name":"David",
... "Age":22
... }
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5e5a0ae42ae06a1609a00b08")
}2. 登録したドキュメントの確認
find() メソッドを使って、コレクション内のすべてのドキュメントを表示します。
> db.demo375.find();
実行すると、以下のような出力が得られます。
{ "_id" : ObjectId("5e5a0ae42ae06a1609a00b06"), "details" : { "Name" : "John", "Age" : 23 } }
{ "_id" : ObjectId("5e5a0ae42ae06a1609a00b07"), "details" : { "Name" : "David", "Age" : 21 } }
{ "_id" : ObjectId("5e5a0ae42ae06a1609a00b08"), "details" : { "Name" : "David", "Age" : 22 } }3. キー名が不明な状態での検索クエリ
それでは、キー名が不明な場合の検索クエリを見てみましょう。ポイントは以下の3つのステージです。
- $addFields: 各ドキュメントに新しい一時フィールドを追加します。
- $objectToArray: ドキュメント(
$$ROOT)をキーと値のペアの配列に変換します。 - $match: 変換後の配列から目的の値を持つドキュメントを絞り込みます。
> db.demo375.aggregate([
... { "$addFields": {
... "UnknownKeys": { "$objectToArray": "$$ROOT" }
... }},
... { "$match": { "UnknownKeys.v.Name": "David" }},
... { "$project": { "UnknownKeys": 0 }}
... ])4. 実行結果
このクエリを実行すると、Name フィールドの値が「David」であるドキュメントだけが出力されます。
{ "_id" : ObjectId("5e5a0ae42ae06a1609a00b07"), "details" : { "Name" : "David", "Age" : 21 } }
{ "_id" : ObjectId("5e5a0ae42ae06a1609a00b08"), "details" : { "Name" : "David", "Age" : 22 } }仕組みの解説
$objectToArray は、オブジェクトを { k: キー名, v: 値 } という形式の配列に変換する演算子です。この例では、ルートドキュメント全体($$ROOT)を配列化して一時フィールド UnknownKeys に格納しています。
その後、$match ステージで UnknownKeys.v.Name の値が「David」であるものだけを抽出し、最後に $project ステージで作業用の UnknownKeys フィールドを出力結果から除外しています。これにより、ネストされたフィールドのキー名が事前にわからなくても柔軟にドキュメントを検索できるのです。
-
MongoDBコレクションの全キー(フィールド名)を取得する方法まとめ
この記事は2019年1月18日にObjectRocket.com/blogで公開された内容をもとにしています。 MongoDB®のコレクションに含まれるすべてのキーを把握することは、スキーマの検証、フィールド名のタイプミスのデバッグ、設定すべきでないフィールドの発見など、さまざまな場面で役立ちます。本記事では、MongoDBコレクション内の全キー名を取得する複数の方法を、状況別にわかりやすく解説します。 まず検討したい:ODMやマネージドサービスの活用 ObjectRocketをはじめとする多くのMongoDB-as-a-Service事業者は、ユーザーインターフェース(UI)上で簡単にキーを
-
MongoDBコレクション内の全キー名を取得する方法|MapReduce・Aggregation・シェルなど状況別に解説
スキーマの検証、フィールド名のタイプミスのデバッグ、設定されるべきではないフィールドの発見などを行うには、まずMongoDBコレクション内にどのようなキーが存在するのかを把握しておく必要があります。多くのMongoDB-as-a-Service事業者は、UI上で手軽にこれを実現できる機能を提供しています(ObjectRocketもそのひとつです)。また、経験豊富なMongoDBユーザーの多くは、JavaScript向けのMongooseやPython向けのMongoengineといったオブジェクトドキュメントマッパー(ODM)を導入しています。ODMを使えば、アプリケーション向けの一貫性のある