PHP数组交集 - 查找公共子集

时间:2015-07-11 15:53:25

标签: php arrays mongodb tree intersection

我有存储在mongodb集合中的数据 - 页面。每个页面都有以下属性:

TypeError: $(...).get(...).show is not a function
http://www.ten103.com/javascript/global_desktop.js
Line 15

我在DB中存储了大约500页,性能对我来说不是很重要。

我需要在所有页面中找到共同内容。如果我这样做:

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

像这样,我可以在所有正常工作的页面上获得通用内容。只要所有页面中至少有一个共同的“内容”,就是这样。

但我需要在所有页面中找到共同的子集。例如,找到第1-50页中常见的内容,可能是第45,59,79,123页中常见的另一个子集,...另一个可能在第450 - 459页中很常见

找到这些常见子集的更好的解决方案?它需要创建树吗?

感谢。

1 个答案:

答案 0 :(得分:0)

这一切都取决于"其中"您认为属于"重复的属性"或至少"共同的#34;。

你可以做到

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

每个子键分组。

所有"分组"是一种“建筑物”的形式。但是,你在这里要求的并不是那么清楚。只是试图展示一些你似乎正在做的事情更有效率。