2016-07-01 2 views
1

저는 현재 MongoDB를 데이터베이스로 사용하고있는 GeoSpatial 프로젝트와 Meteor로 내 앱을 만들고 있습니다. MongoDB에서 mapReduce를 사용하여 공간 데이터에 대한 쿼리를 실행했으며 Meteor (자바 스크립트 파일)에이 코드 (쿼리)를 저장하려고합니다. 나는 그것에 대한 연구를했지만 여전히 문제가있다. meteor에 mapReduce 함수를 작성하는 방법을 모르겠습니다.Meteor javascript 파일에서 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

은 기본적으로 당신이 비슷한 방법으로 그것을 할 수 있습니다 :

  • 위의 댓글에서 언급 package를 사용

    여기 MongoDB를 내 맵리 듀스 코드입니다.

  • 또는 언급 된 패키지를 사용하는 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

관련 문제