我在RoboMongo中有一个嵌套的值数组;
或者这可能会稍微清楚一点;
有没有办法能够(在一个查询中)使用正则表达式搜索所有键/值对?该脚本将不知道有多少个customField键/值对!
到目前为止,我已经使用PHP了;
['poco.customFields.0.value' => ['$regex' => '.*'.$query.'.*', '$options' => 'i']],
哪个正在处理第一个键/值对...但不是其他人而且我不知道怎么做而不做两个查询或只是猜测不会超过,比方说, 100只是循环它。
答案 0 :(得分:0)
假设您想获取包含与特定正则表达式匹配的customFields内容的文档,我可以想到两种解释。
(1)在与模式匹配的customFields中返回至少一个值的所有文档:
[ 'customFields.value' => [ '$regex' => $pattern, '$options' => 'i' ]]
(2)在与模式匹配的customFields中返回包含所有值的所有文档:
[ 'customFields.value' => [ '$not' => new MongoDB\BSON\Regex('\b^(?!'.$pattern.').+', 'i') ]]
第一个查询是不言自明的:遍历customFields数组的所有元素并对每个元素执行正则表达式检查。如果至少有一个元素与模式匹配,则返回父文档。
第二个更复杂一点。要求"其中所有元素匹配特定模式"相当于"其中没有单个元素不匹配特定模式"。为了实现双重否定,我们使用$not
以及通过将负前瞻应用于我们之前使用的同一查询而创建的反向正则表达式。由于$not
拒绝接受字符串,因此我们使用MongoDB\BSON\Regex类的实例生成立即的正则表达式。
有关消极前瞻的更多信息,请参见here。