map 関数のトラブルシューティング
項目一覧
注意
map-reduce の代替としての集計パイプライン
MongoDB 5.0以降、 map-reduceは非推奨です。
map-reduceの代わりに、集計パイプラインを使用する必要があります。 集計パイプラインは、map-reduce よりもパフォーマンスとユーザビリティが優れています。
$group
$merge
などの集約パイプライン ステージ を使用して、map-reduce操作を書き換えることができます。カスタム機能を必要とする map-reduce 操作には、
$accumulator
と$function
の集計演算子を使用できます。 これらの演算子を使用して、JavaScript でカスタム集計式を定義できます。
map-reduce を集計パイプラインに置き換える例については、以下を参照してください。
また、map-reduce 操作よりも集計パイプラインの方がトラブルシューティングが簡単です。
map
関数は、値をキーに関連付けたり「マッピング」したり、 map-reduce操作中にキーと値のペアを出力したりするJavaScript関数です。
キーと値のペアの検証
map
関数によって出力されるkey
とvalue
のペアを確認するには、独自のemit
関数を記述します。
次のプロトタイプのドキュメントを含むコレクションorders
について考えます。
{ _id: ObjectId("50a8240b927d5d8b5891743c"), cust_id: "abc123", ord_date: new Date("Oct 04, 2012"), status: 'A', price: 250, items: [ { sku: "mmm", qty: 5, price: 2.5 }, { sku: "nnn", qty: 5, price: 2.5 } ] }
各ドキュメントの
price
をcust_id
にマッピングし、cust_id
とprice
のペアを出力するmap
関数を定義します。var map = function() { emit(this.cust_id, this.price); }; キーと値を出力するには、
emit
関数を定義します。var emit = function(key, value) { print("emit"); print("key: " + key + " value: " + tojson(value)); } orders
コレクションからの単一のドキュメントを使用してmap
関数を呼び出します。var myDoc = db.orders.findOne( { _id: ObjectId("50a8240b927d5d8b5891743c") } ); map.apply(myDoc); キーと値のペアが期待どおりであることを確認します。
emit key: abc123 value:250 orders
コレクションから複数のドキュメントを使用してmap
関数を呼び出します。var myCursor = db.orders.find( { cust_id: "abc123" } ); while (myCursor.hasNext()) { var doc = myCursor.next(); print ("document _id= " + tojson(doc._id)); map.apply(doc); print(); } キーと値のペアが期待どおりであることを確認します。
Tip
以下も参照してください。
map
関数はさまざまな要件を満たしている必要があります。 map
関数のすべての要件のリストについては、 mapReduce
または mongosh
ヘルパー メソッドdb.collection.mapReduce()
を参照してください。