2011-10-24 16 views
0

MongoのMapReduceを使って、いくつかのドキュメントのトークンの逆インデックスを生成しています。マップ関数でドキュメントの_idにアクセスするのに問題があります。MongoDB MapReduceのmap関数でthis._idにアクセスするには?

例の文書:

{ 
     "_id" : ObjectId("4ea42a2c6fe22bf01f000d2d"), 
     "attributes" : { 
       "name" : "JCDR 50W38C", 
       "upi-tokens" : [ 
         "50w38c", 
         "jcdr" 
       ] 
     }, 
     "sku" : "143669259486830515" 
} 

(フィールドttributes [ 'UPI-トークンは']私が逆のインデックスを作成するテキスト・トークンのリストである。)

地図機能(のソース問題):

m = function() { 
    this.attributes['upi-tokens'].forEach(
     function (token) { emit(token, {ids: [ this._id ]}); } 
    ); } 

削減機能:

r = function (key, values) { 
    var results = new Array; 
    for (v in values) { 
     results = results.concat(v.ids); 
    } 
    return {ids:results}; 
} 

のMapReduceコール:私ではなく、実際のオブジェクトID列のIDを期待結果のコレクションがヌル値がどこにでも持って

db.offers.mapReduce(m, r, { out: "outcollection" }) 

PROBLEM。

考えられる理由:

私は同等であることを、次の2つの機能を期待していたが、彼らはありません。

m1 = function (d) { print(d['_id']); } 
m2 = function() { print(this['_id']); } 

は、今は実行:

db.offers.find().forEach(m1) 
db.offers.find().forEach(m2) 

差は、各ドキュメントのM2印刷未定義所望のようにM1がIDSを印刷しつつあります。私は理由を知りません。

質問:

  1. 私はMapReduceの中に使用するためマップ機能では、現在のオブジェクトの_idを取得するにはどうすればよいですか? this._idまたはthis ['_ id']は機能しません。
  2. なぜ正確ではないm1m2は同等ですか?

答えて

関連する問題