2011-09-20 39 views
0

我有一個問題,我需要一些幫助,但我覺得我很接近。它涉及鋰和MongoDB的代碼如下所示: 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" 
    ] 
] } 


**/ 

我有一個用戶節約方面,他們搜索,然後我試圖讓最populars條款 但我不斷收到這樣的錯誤:未捕獲的異常'異常'與消息'MongoDB :: __構造(無效名稱)。有沒有人有任何想法如何做到這一點或某些方向?

回答

1

首先我不會存儲在用戶對象。MongoDb對象有一個上限的4/16MB(取決於版本)現在這個限制通常不是問題,但是當在一個對象上內聯登錄時,你可能能夠達到它。更爲真實的問題是,每次需要對這些對象進行操作時,都需要將它們加載到RAM中,並且它變得非常耗時。我不認爲你想要你的用戶對象。

其次,對象中的數組無法排序,並且可能還有其他限制,可能會在以後出現。

但是,如果你想這樣做(低搜索量應該不是真的問題),你可以通過使用組查詢來解決這個問題。 組查詢與sql中的組查詢非常相似,所以它是一個輕微的技巧,因爲您需要對大多數對象共享的內容進行分組。 (可能是用戶的活躍領域)。

因此,這裏有一個工作組示例,它將根據您的結構對詞進行求和。 只需將此方法放入模型中,並執行MyModel :: searchTermUsage()即可獲取Document對象。

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 
    )); 
} 

有一個在條款場(你必須在你的榜樣空值)對非數組類型沒有保障。爲了簡單起見,我將其刪除,在數據庫最終結束之前最好將其刪除。