5

에 의해 Laravel하여 MongoDB에 MongoDB를 집계 쿼리를 변환하는 내가 MongoDB의 수집이 는 다음과 같은 데이터 라는 방법 jenssegers

{ "date" : ISODate("2014-06-09T00:00:00.000Z"), "field" : "ip", "from" : "157.11.209.123", "to" : "107.21.109.254" } { "date" : ISODate("2014-05-15T00:00:00.000Z"), "field" : "ip", "from" : "107.21.109.254", "to" : "157.11.209.123" } { "date" : ISODate("2014-06-09T00:00:00.000Z"), "field" : "registration", "from" : "Old service", "to" : "Some new service" } 

그럼 난 field에 의해 발생 및 그룹을 계산 일반적인 SQL 쿼리를 만들고 싶어

를 포함하는
변경합니다. 그래서,
db.changes.group({ 
    "key": { 
     "field": true 
    }, 
    "initial": { 
     "count": 0, 
    }, 
    "reduce": function(obj, prev) { 
      prev.count++; 
    }, 
}); 

그것은 잘 작동하지만 가 어떻게 Laravel 4 일로 변환 할 수 있습니다 MongoDB를

에서 쿼리를 만들었습니다? mongo 서버와 통신하기 위해 jenssegers/laravel-mongodb을 사용하고 있습니다.

또한 추가 질문을하기 위해 제거한 쿼리가 더 많아서 해당 쿼리를 다른 가능한 솔루션이 아닌 laravel로 정확하게 변환하는 솔루션을 찾고 있습니다. :)

답변

8

집계 프레임 워크 메소드를 사용하는 것이 더 좋으며 기본 드라이버에서 제공하는 원시 MongoDB 컬렉션 객체로 다이빙하는 것이 좋습니다. 그것은 구문을 번역하려고하는 더 나은 옵션입니다 :

// Returns the original Mongo Result 
$result = DB::collection('changes')->raw(function($collection) 
{ 
    return $collection->aggregate(array(
     array(
      '$group' => array(
       '_id' => '$field', 
       'count' => array(
        '$sum' => 1 
       ) 
      ) 
     ) 
    )); 
}); 

결과는 .group() 같은 방법의 결과는 조금 다르지만이는 MongoDB를 서버에서 네이티브 코드를 사용하고 같은 자바 스크립트 해석에 의존하지 않는 .group() 메서드는 실제로 mapReduce를 감싸는 래퍼입니다.

최종 결과는 네이티브 프레임 워크 인터페이스에서 벗어나는 것보다 훨씬 빠르고 일반적으로 더 효율적입니다.

최상의 성능을 위해 기본 MongoDB 방식을 사용하십시오.

+0

괜찮 았지만 가능한 단점이 있습니다. 나는 어떤 기간에 (지난 주와 지난 달 안에) 모든 것을 계산할 필요가있다. 나는 2 개의 쿼리를 실행하고 싶지 않지만, 하나는 만들 수 있습니다. 내 원래 쿼리를 첨부했습니다. 귀하의 예제에서 사용자 정의 함수를 어떻게 실행할 수 있습니까? –

+2

@estshy 당신의 질문을 당신이 가진 방식으로 바꾸는 것은 정말로 좋은 생각이 아닙니다. 함께 제공된 사람들이 제공 한 답변이 당신이 요구 한 것과 일치하지 않는다는 사실을 매우 오도하는 것입니다. 다른 질문을 올리면 다른 사람들도 대답하게되어 기쁠 것입니다. 일반적인 경우는 하나의 질문에 대한 답입니다. 나는 당신의 추가 질문에 대답 할 수 있지만 그것은 완전히 다른 질문이어야합니다. 별도로 게시하십시오. –

관련 문제