Php 在MongoDB中搜索所有集合数组

Php 在MongoDB中搜索所有集合数组,php,mongodb,Php,Mongodb,我有一个嵌套的值数组,在RoboMongo中看起来像这样 或者这可能更清楚一些 是否有一种方法可以(在一个查询中)使用正则表达式搜索所有键/值对?脚本将不知道有多少customField键/值对 到目前为止,我已经在PHP ['poco.customFields.0.value'=>['$regex'=>'...'.'.'$query..'.'.'.'$options'=>'i']], 它正在很好地处理第一个键/值对。。但是其他人不行,我不知道如何做到这一点,如果不进行两次查询,或者只是猜测

我有一个嵌套的值数组,在RoboMongo中看起来像这样

或者这可能更清楚一些

是否有一种方法可以(在一个查询中)使用正则表达式搜索所有键/值对?脚本将不知道有多少customField键/值对

到目前为止,我已经在PHP

['poco.customFields.0.value'=>['$regex'=>'...'.'.'$query..'.'.'.'$options'=>'i']],


它正在很好地处理第一个键/值对。。但是其他人不行,我不知道如何做到这一点,如果不进行两次查询,或者只是猜测不会超过100个,然后循环遍历它。

假设您想要获取自定义字段内容与特定正则表达式匹配的文档,我可以想到两种解释

(1) 返回与模式匹配的customFields中至少有一个值的所有文档:

[ 'customFields.value' => [ '$regex' => $pattern, '$options' => 'i' ]]
[ 'customFields.value' => [ '$not' => new MongoDB\BSON\Regex('\b^(?!'.$pattern.').+', 'i') ]]
(2) 返回与模式匹配的customFields中包含所有值的所有文档:

[ 'customFields.value' => [ '$regex' => $pattern, '$options' => 'i' ]]
[ 'customFields.value' => [ '$not' => new MongoDB\BSON\Regex('\b^(?!'.$pattern.').+', 'i') ]]
第一个查询是自解释的:遍历customFields数组的所有元素,并对每个元素执行正则表达式检查。如果至少有一个元素与模式匹配,则返回父文档

第二个更复杂。要求“其中所有元素匹配特定模式”等同于“其中没有单个元素不匹配特定模式”。为了实现双重否定,我们使用
$not
以及反向正则表达式,该表达式是通过对我们以前使用过的同一查询应用负前瞻而创建的。由于
$not
拒绝接受字符串,我们使用类的实例生成立即正则表达式


可以找到更多关于反向前瞻的信息。

我确信可以使用$where完成此操作,但不确定php语法,您可以检查$where,在其中您可以传递一个javascript函数,该函数可以循环数组中的键值对。您期望的输出是什么?你能把它加在你的问题上吗?太棒了。我做了一些测试,它似乎有效。我想不到查询会知道如何迭代数组,而不仅仅是出错。@mikelovelyuk我很高兴能够提供帮助。请考虑将答案作为接受,如果它确实解决了你的问题,或添加更多的细节,你想澄清,如果有任何。