如何在Doctrine ODM中编写字段比较的$match匹配表达式
如何在Doctrine ODM中实现基于字段对比的$match查询?
问题背景
当前正在将大型数据管道迁移至Doctrine ODM,MongoDB文档结构如下:
{"_id":"M-1ea13520-7c30-4482-b5bf-2f8467aa1735","chatId":"C-91772cdf-c10b-4faa-9536-98a65554356c","publishedAt":{"$date":{"$numberLong":"1696322511000"}},"lastSeen":{"$date":{"$numberLong":"1696204800000"}}}
在原生MongoDB中,使用以下$match查询可正常筛选出lastSeen小于publishedAt的文档:
{$match:{$expr:{$lt:["$lastSeen","$publishedAt"]}}}
但转写为Doctrine ODM代码时出现错误:
->match()->field('$lastSeen')->lt('$publishedAt')
错误信息:unknown top level operator: $lastSeen. If you have a field name that starts with a '$' symbol, consider using $getField or $setField.
解决方案
要实现该查询,需要利用Doctrine ODM的expr()方法构建表达式上下文,让$前缀的字段引用被正确解析,而非被当成顶级操作符。正确代码如下:
// 假设已获取DocumentManager及对应文档实体类 $queryBuilder = $documentManager->createQueryBuilder(YourDocumentEntity::class); $queryBuilder->match() ->expr() ->lt('$lastSeen', '$publishedAt');
原理说明
原生MongoDB查询依赖$expr实现文档内字段的对比操作,Doctrine ODM的expr()方法对应原生的$expr操作符,会将内部表达式逻辑包裹在$expr上下文里,确保$lastSeen和$publishedAt被正确识别为文档字段引用。
内容的提问来源于stack exchange,提问作者user2740217
相关产品推荐
相关产品推荐

