2015-07-11 44 views
0

我有存儲在mongodb集合 - 頁面中的數據。每頁有以下屬性:PHP數組交叉點 - 找到公共子集

title - string 
    id - number 
    contents - it is an object with 3 attribute 
     contents.topic - string 
     contents.parentTopic - number 
     contents.text - string 

我有大約500頁存儲在數據庫中,性能對我來說不是一個很大的考慮。

我需要找到所有頁面的共同內容。如果我做以下事情:

$pages = $db->selectCollection("pages");  
    $cursor = $pages->find(array()); 
    $data = array(); 

    foreach ($cursor as $page){ 
     array_push($data,$page); 
    } 
    $intersect = call_user_func_array('array_intersect_assoc',$data); 
    echo "<pre>"; 
    print_r($intersect); 

像這樣,我可以在所有工作正常的頁面上獲得通用內容。只要所有頁面中至少有一個共同的「內容」,就是如此。

但我需要找到所有頁面的公共子集。例如,找到第1-50頁中常見的內容,可能是第45,59,79,123頁中常見的另一個子集,另一個可能在第450-459頁中很常見

任何更好的解決方案找到這樣的共同子集?它需要創建樹嗎?

謝謝。

+0

這種相似性檢查的目的是什麼?我認爲當頁面數量變大時,所需資源將呈指數增長。 – insanebits

+0

這是正確的,但頁數不會增長,幾乎將保持在500左右。 – Ahmad

回答

0

這一切都取決於您認爲「重複」或至少「對一組共同」的「哪些」屬性。

你可以做

$pages->aggregate(
    array(
    '$group' => array(
     '_id' => '$content', 
     'pages' => array('$push' => '$id'), 
     'count' => array('$sum' => 1) 
    ) 
) 
); 

這是很多更有效的客戶端代碼,您正在使用。

或者你甚至可以做

$pages->aggregate(
    array(
    array( 
     '$project' => array(
     'title' => 1, 
     'id' => 1, 
     'contents' => 1, 
     'types' => array('$literal' => array('topic', 'parentTopic', 'text')) 
    ) 
    ), 
    array('$unwind' => '$types'), 
     array(
     '$group' => array(
      '_id' => array( 
      'type' => '$types', 
      'content' => array(
       '$cond' => array(
       array('$eq' => array('$types', 'topic')), 
       '$content.topic', 
       array(
        '$cond' => array(
        array('$eq' => array('$types', 'parentTopic')), 
        '$content.parentTopic', 
        '$content.text' 
       ) 
       ) 
      ) 
      ) 
     ), 
      'pages' => array('$push' => '$id'), 
      'count' => array('$sum' => 1) 
     ) 
    ) 
    ) 
) 
); 

每個子鍵哪些羣體。

所有「分組」都是「集合建築」的一種形式。但是這真的不太清楚你在這裏要求什麼。只是試圖展示一些更有效的東西,看起來你在做什麼。

+0

這是正確的,但它有500頁,每頁有近400-500個內容塊。我需要查找這些頁面中常見的內容塊。所有頁面都不需要內容塊,所以我需要找到更小的子集。我會嘗試分組。 – Ahmad