2016-07-01 12 views
1

私は現在、MongoDBをデータベースとして、Meteorを使ってアプリケーションを作成しているGeoSpatialプロジェクトに取り組んでいます。私は空間データのMongoDBでいくつかのクエリ(mapReduce)を実行しました。このコード(クエリ)をMeteor(javascriptファイル)に配置したいと思います。私はそれについていくつかの研究をしましたが、私はまだ問題があります。流星にmapReduce関数を書く方法がわかりません。ここMeteor javascriptファイルでMongoDB mapReduce関数を使用する方法は?

はMongoDBの中の私のMapReduceコードです:

var map1 = function() { 

var px =-83.215; 
var py =41.53; 

if(this.geometry.minlon<=px && px<=this.geometry.maxlon && this.geometry.minlat<=py && py<=this.geometry.maxlat)  
{emit(this._id, 1);} 

} 

var reduce1 = function(key, value) { 
return Array.sum(value) 
} 

db.C1DB.mapReduce(map1, reduce1, { 
out: "CollectionName" 
}) 
+1

[monbro:mongodb-mapreduce-aggregation](https://atmospherejs.com/monbro/mongodb-mapreduce-aggregation)パッケージ –

答えて

4

基本的には2と同様の方法でそれを行うことができます。上記のコメントで述べたpackageを使用して

  • または上記のパッケージに記載されているRaw Collection APIを使用してください。

は、ここでパッケージなしでそれを行う方法の例を働いている:

C1DB = new Mongo.Collection('c1db'); 
CollectionName = new Mongo.Collection('CollectionName'); 

Meteor.methods({ 
    doMapReduce: function() { 
     var mapFn = function() { 
      var px = -83.215; 
      var py = 41.53; 

      if (this.geometry.minlon <= px && px <= this.geometry.maxlon && this.geometry.minlat <= py && py <= this.geometry.maxlat) { 
       emit(this._id, 1); 
      } 
     }; 

     var reduceFn = function (key, value) { 
      return Array.sum(value) 
     }; 

     var rawC1DB = C1DB.rawCollection(); 

     // convert mapReduce to synchronous function 
     var syncMapReduce = Meteor.wrapAsync(rawC1DB.mapReduce, rawC1DB); 

     // CollectionName will be overwritten after each mapReduce call 
     syncMapReduce(mapFn, reduceFn, { 
      out: "CollectionName" 
     }); 

     return CollectionName.find({}).fetch(); 
    } 
}); 
+0

ありがとうございました!できます!私はなぜmapReduceを同期関数に変換する必要があるのか​​不思議です。また、私はrawCollection関数に関するいくつかの研究を行ったが、私はまだその役割について混乱している。 –

+0

Meteorのメソッドから還元された結果を返す場合は、 'wrapAsync'が必要です。コールバックからメソッドの結果を返すことは不可能です( 'wrapAsync'がなければ)。 – Tdm

+0

Meteorの 'Mongo.Collection'は' mapReduce'メソッドをサポートしていません。そのため、単純なMongo DBコレクションを取得するために 'rawCollection'を使用しています。ところで、この答えがあなたのために働くなら、それは正解とマークしてください。それで、同様の問題を抱えている他の人にも役立ちます。 – Tdm

関連する問題