我目前正在尝试转换此JS代码:
db.Issue.aggregate( [
{ // Filter out issues that have been worked on after our given week = All worklogs muste have been before date
$match : {
worklogs: { $all: [
{
"$elemMatch" : {
date: { $lte: endDate }
}
},
] }
}
}
] )
(根据官方文件:Use $all with $elemMatch
使用其聚合构建器进入Doctrine ODM代码:
$builder = $this->createAggregationBuilder();
$aggregation = $builder
->match()
->field('worklogs')
->all([
$builder->matchExpr()->elemMatch(
$builder->expr()->field('date')->lte($week->getEndDate())
)
])
;
但是,显然我无法正确匹配$all
- 这意味着允许我确保集合中的所有条目都满足$elemMatch
检查的要求。
JS中的原始MongoDB查询似乎可以解决这个问题,但我无法在PHP中获得相同的结果。到目前为止,我甚至不确定Doctrine能否处理$all
和$elemMatch
的组合。
更新:
谢谢大家到目前为止的评论!然而,我仍在为$not
/ ->not()
运算符的当前查询语法(在PHP中!)进行挣扎。我已经在这里检查了文档:Doctrine ODM Docs但找不到任何有用的东西。 (请注意,我在这里使用的是2.0版)。
现在我的查询看起来像:
->match()
->field('worklogs')
->not([
$builder->matchExpr()->elemMatch(
$builder->matchExpr()->field('date')->gt($week->getEndDate())
)
])
但导致此错误:
1)App \ Tests \ Repository \ IssueRepositoryTest :: testGetEstimationsPerWeek MongoDB \ Driver \ Exception \ CommandException:$不需要正则表达式或文档/var/www/html/vendor/mongodb/mongodb/src/Operation/Aggregate.php:263 /var/www/html/vendor/mongodb/mongodb/src/Collection.php:223 /var/www/html/vendor/doctrine/mongodb-odm/lib/Doctrine/ODM/MongoDB/Aggregation/Builder.php:168 /var/www/html/vendor/doctrine/mongodb-odm/lib/Doctrine/ODM/MongoDB/Aggregation/Stage.php:35 /var/www/html/src/Repository/IssueRepository.php:85
所以感谢@ neil-lunn的帮助,我能够找到正确的查询:
->match()
->field('worklogs')
->not(
$builder->matchExpr()->elemMatch(
$builder->matchExpr()->field('date')->gt($week->getEndDate())
)
)