Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php mongoDB$all导致100 cpu旋转_Php_Mongodb - Fatal编程技术网

Php mongoDB$all导致100 cpu旋转

Php mongoDB$all导致100 cpu旋转,php,mongodb,Php,Mongodb,我将尝试描述我的场景: 集合中的每个文档都有一个元素数组:[元素X,元素Y..] 最终用户希望找到与所选元素数组最匹配的集合。 用户元素数组:[元素foo,元素条,元素w] 我所做的是在一个查询中使用$all-从原始用户数组开始,然后是所有的排列,所有的n-1元素可能性,所有的n-2元素可能性等等。。。直到我给他50个结果 当然,我为数组的字段建立了索引,一切都很好 问题是-我有一个用户输入了超过40个元素。。。根据评测,这导致了一个缓慢的查询millis:125,并且mongoDB在重新启动之

我将尝试描述我的场景:

集合中的每个文档都有一个元素数组:[元素X,元素Y..] 最终用户希望找到与所选元素数组最匹配的集合。 用户元素数组:[元素foo,元素条,元素w]

我所做的是在一个查询中使用$all-从原始用户数组开始,然后是所有的排列,所有的n-1元素可能性,所有的n-2元素可能性等等。。。直到我给他50个结果

当然,我为数组的字段建立了索引,一切都很好

问题是-我有一个用户输入了超过40个元素。。。根据评测,这导致了一个缓慢的查询millis:125,并且mongoDB在重新启动之前被卡在100%的CPU上。 我一遍又一遍地看到这个查询,直到重新启动

所以我的问题分为两个问题:

技术-为什么查询一直在重试?好的-这是一个艰难而缓慢的查询,但是我可以阻止它不必要地重新尝试配置吗

算法-任何人都知道一个优雅的解决方案,而不限制用户在搜索中的元素数

代码片段:PHP

$combinations_array = $this->combinations($elements_array, $current_match_count);
foreach ($combinations_array as $combination) 
{
    $query = array( 'element.name' =>  array('$all' => $combination ) ) ;
    $cursor = $collection->find($query);
}

其中combines是一个函数,它输出大小为$current\u match\u count的所有组合

查询是如何执行的?也许是一些代码?MongoDB似乎不太可能重试查询。其他的东西似乎在这样做,这将是一个地方看。那么为什么CPU卡在100%?这听起来正是你所说的。您一遍又一遍地看到相同的查询。这意味着有什么东西在重新结束它。您可以复制查询内容并自己发布,以查看是否可以在外部复制。但我敢打赌,有一些代码正在重新发送查询,这不是MongoDB自己做的。@neil-尝试了MongoShell的查询-同样的事情。CPU处于100%状态大约一分钟后,我重新启动了它db.mycollection.find{element.name:{$all:[elem1,elem2,…elem43]}我对这里的循环的目的以及它到底产生了什么感到困惑。但现在把它放在一边。您是说有一个$all查询,其中包含43个元素。它所匹配的阵列的平均大小是多少?我们所说的藏品中有多少文件?为您的问题提供有用的信息,以便有机会重现。