map/reduce について、また、それが私が達成しようとしているタスクに適しているかどうかについて質問があります。まだ設計段階なので、必要に応じてデータの構造を変更できます。
次のような 2 つのドキュメントがあるとします。
{ "_id" : ObjectId( "50231b4f8be6e5f1f2e7e24g" ),
"customer" : "50bac36bb4e54678170002e6",
"display" : "Motorola Canopy 100",
"description" : "a radio" }
{ "_id" : ObjectId( "50232fac8be6e4f1f2e7e259" ),
"display" : "Motorola POE",
"description" : "a power injector",
"device" : "50231b4f8be6e4f1f2e7e24g" }
あるドキュメントには顧客 ID 参照 (「customer」: 「50bac36bb4e54678170002e6」) があり、別のドキュメントにはデバイス ID 参照 (「device」: 「50231b4f8be6e4f1f2e7e24g」) があります。これらのドキュメントは両方とも、ある種のデバイスを表しています。デバイスは、顧客に関連付けられる (別名、割り当てられる) か、別のデバイスに関連付けられます。たとえば、顧客がラジオを受け取り、それがそのように割り当てられますが、パワー インジェクタは顧客ではなく、ラジオ自体に割り当てられます。これを行ったのは、デバイス間の運用上の依存関係をよりよく理解できるようにするためです。この階層的な関連付けパターンを維持することは有用であり、可能であれば維持したいと考えています。
現在、最初にすべてのデバイスを検索し、次に見つかった各デバイスに対して、関連するデバイスを探す別のクエリを実行する一連のクエリを実行しています。これは、特定のデバイスへの関連付けがある限り深く実行できる再帰的な操作です。
この問題が map/reduce 操作に適しているかどうかを知りたいです。現在の再帰的操作に固執する必要がありますか、それともこれは map/reduce に適していますか?
編集 1
コメントで提起された質問からのさらなる明確化:
- これらの文書がすべて同じコレクションにあるというのは本当ですか? はい 単一の「デバイス」コレクションがあります。ただし、顧客 ID は別のコレクションのものです。ただし、このクエリでは、その ID のみを使用して、デバイス コレクションからの結果をグループ化します。SQL用語を借りるための「結合」は行われず、必要もありません。顧客キーとデバイス キーは、並べ替えが必要な属性と考えてください。
- また、「すべてのデバイスを見つける」ためにクエリを実行すると言います。「顧客 ID を指定してすべてのデバイスを検索する」ということですか? はい: 実行される最初のクエリは、キーである顧客 ID に基づいています。基本的には次のようになります: db.devices.find({"customer" : "50bac36bb4e54678170002e6"}). 次に、その結果を取得して反復処理し、ストレートな JavaScript を使用してハッシュをソートし、サブクエリを起動します。次に、実行する新しいクエリがいくつか残っています。基本的に、最初のクエリでキャプチャされたすべての _id は、次のようなものでクエリされます。そのクエリは、最初のクエリで発見されなかった新しいドキュメントを生成します。db.devices.find で新しい結果が得られなくなるまで、このサブクエリの手順を続けます。次に、これらの結果に対してさらに JavaScript を実行し、それらを最初の結果にマージして、ハッシュ ツリーを構築します。それが私がツリーを構築する方法を知っている方法です。
- すべてのデバイスが 1 人の顧客に「アップ」するというのは本当ですか? はい
- デバイスが複数の親デバイスまたは顧客に属する可能性はありますか? いいえ