如何创建MongoDB普通查询检查字段是否包含同文档另一字段值
解决MongoDB普通查询中检查字段包含同文档另一个字段值的问题
问题核心
需要在**普通查询(非聚合)**中实现:检查title字段是否包含同文档的brand字段值,同时保留现有嵌套条件逻辑,使用MongoDB 6.0.1+及最新PHP驱动。
原代码错误点
$toString语法错误:原写法用数组包裹字段引用,正确的表达式应为直接指定字段路径"$title"$not结构错误:无需额外嵌套数组,$regexMatch可直接作为$not的参数- 缺失
brand类型转换:未将brand转为字符串,可能导致正则匹配失败
修正后的条件代码片段
[1] => Array ( ['$expr'] => Array ( ['$not'] => Array ( ['$regexMatch'] => Array ( 'input' => ['$toString' => '$title'], 'regex' => ['$toString' => '$brand'], 'options' => 'i' ) ) ) )
完整整合后的查询数组
Array ( ['$and'] => Array ( [0] => Array ( ['$and'] => Array ( [0] => Array ( ['$and'] => Array ( [0] => Array ( 'brand' => Array ( ['$exists'] => true ) ) [1] => Array ( 'brand' => Array ( ['$ne'] => '' ) ) [2] => Array ( 'brand' => Array ( ['$ne'] => null ) ) ) ) [1] => Array ( ['$expr'] => Array ( ['$not'] => Array ( ['$regexMatch'] => Array ( 'input' => ['$toString' => '$title'], 'regex' => ['$toString' => '$brand'], 'options' => 'i' ) ) ) ) ) ) ) )
关键说明
$expr的作用:允许在普通查询条件中使用聚合表达式,满足不使用聚合流程的要求$toString:确保title和brand都转为字符串类型,避免类型不匹配导致的正则匹配失败$regexMatch:MongoDB 4.2+支持的表达式,用于在$expr中执行正则匹配,其中regex参数可直接引用同文档字段options: 'i':开启大小写不敏感匹配,可根据业务需求移除
内容的提问来源于stack exchange,提问作者Razvan Pepelea
相关产品推荐
相关产品推荐

