2011-09-20 2 views
0

나는 약간의 도움이 필요하지만 나는 가깝다고 느낀다. 그것은 리튬을 포함하고 MongoDB를 코드는 다음과 같습니다 : catch되지 않은 예외 : http://pastium.org/view/0403d3e4f560e3f790b32053c71d0f2b지도 줄이기 가장 인기있는 태그

$db = PopularTags::connection(); 

     $map = new \MongoCode("function() { 
      if (!this.saved_terms) { 
       return; 
      } 

      for (index in this.saved_terms) { 
       emit(this.saved_terms[index], 1); 
      } 
     }"); 

     $reduce = new \MongoCode("function(previous, current) { 
      var count = 0; 
      for (index in current) { 
       count += current[index]; 
      } 
      return count; 
      }"); 

     $metrics = $db->connection->command(array(
      'mapreduce' => 'users', 
      'map' => $map, 
      'reduce' => $reduce, 
      'out' => 'terms' 
     )); 

     $cursor = $db->connection->selectCollection($metrics['result'])->find()->limit(1); 
     print_r($cursor); 
/** 
User Data In Mongo 

{ 
"_id" : ObjectId("4e789f954c734cc95b000012"), 
"email" : "[email protected]", 
"saved_terms" : [ 
    null, 

    [ 
     "technology", 
     " apple", 
     " iphone" 
    ], 
    [ 
     "apple", 
     " water", 
     " beryy" 
    ] 
] } 


**/ 

나는 그들이에 검색 한 후 내가 가장 대부분의 플레이 약관 를 얻기 위해 노력하고 있지만이 같은 오류가 계속 사용자 저축 용어를 데 'MongoDB :: __ construct (invalid name') 메시지가있는 '예외'누군가에게이 방법이나 방향을 알려줄 수있는 방법이 있습니까?

답변

1

먼저이 객체를 사용자 객체에 저장하지 마십시오. MongoDb 객체에 상한이 있습니다. 4/16MB (버전에 따라 다름)입니다. 이제이 제한은 일반적으로 문제가되지 않지만 한 객체에 인라인으로 로그인하면 접근 할 수 있습니다. 보다 실제적인 문제는 이러한 객체에 대해 작업해야 할 때마다 RAM에로드해야하며이를 소비해야한다는 것입니다. 나는 당신이 당신의 사용자 객체에 그것을 원하지 않는다고 생각한다.

개체의 두 번째 배열은 정렬 할 수 없으며 나중에 다시 물릴 수있는 다른 제한 사항이 있습니다.

그러나 이렇게하고 싶다면 (검색 량이 적어서는 안됩니다.) 그룹 쿼리를 사용하면 가장 쉽게 해결할 수 있습니다. 그룹 쿼리는 sql의 그룹 쿼리와 매우 비슷하므로 대부분의 개체가 공유하는 항목을 그룹화해야하므로 약간의 트릭이 필요합니다. (사용자의 활성 필드가 아마도).

따라서 구조를 기반으로 사용 된 단어의 합계를 계산하는 작업 그룹 예제를 살펴보십시오. 이 메서드를 모델에 넣고 MyModel :: searchTermUsage()를 실행하여 Document 개체를 다시 가져옵니다. 용어 필드 (당신이 당신의 예에서 null 값을했다)의 배열이 아닌 유형에 대한 보호가 없습니다

public static function searchTermUsage() { 
    $reduce = 'function(obj, prev) { 
     obj.terms.forEach(function(terms) { 
      terms.forEach(function(term) { 
       if (!(term in prev)) prev[term] = 0; 
       prev[term]++; 
      }); 
     }); 
    }'; 
    return static::all(array(
     'initial' => new \stdclass, 
     'reduce' => $reduce, 
     'group' => 'common-value-key' // Change this 
    )); 
} 

. 단순성을 위해 제거했는데 데이터베이스에서 끝나기 전에 이것을 제거하는 것이 좋습니다.

관련 문제