我正在尝试构建带有分组的Doctrine查询(我刚到Mongo,我有很强的SQL背景)。
我想得到所有的结果,有两个或更多的显示在给定的时间。
public function findDisplayedForCompany(string $companyId, DateTime $start)
{
$qb = $this->createQueryBuilder();
$qb->field('interactor')->equals($companyId)
->field('interactionDate')->gte($start)
->group(['interacted' => 'interacted'], ['count' => 0])
->reduce('function (obj, prev) { prev.count++; }')
->field('count')
->gt('1');
$query = $qb->getQuery();
return $query->execute();
}不幸的是,上面的代码没有给我任何结果。
在SQL中,它将类似于SELECT *, COUNT(*) count FROM x GROUP BY interacted HAVING COUNT(*) > 1。
文档结构(非常简单):
class Interaction
{
/**
* @MongoDB\Id
*/
protected $id;
/**
* @MongoDB\ReferenceOne(targetDocument="Company", storeAs="id")
* @var Company
*/
protected $interacted;
/**
* @MongoDB\ReferenceOne(targetDocument="Company", storeAs="id")
* @var Company
*/
protected $interactor;
/**
* @MongoDB\Field(type="date")
* @var \DateTime
*/
protected $interactionDate;
public function __construct(Company $interacted, Company $interactor)
{
$this->interacted = $interacted;
$this->interactor = $interactor;
$this->interactionDate = new \DateTime();
}
}发布于 2017-04-18 12:55:51
我找到了一些解决办法,这可以满足我的需要,但是我对它不满意,所以我仍然在寻求解决最初问题的帮助。
public function findDisplayedForCompany(string $companyId, $start)
{
$qb = $this->createQueryBuilder();
$qb->field('interactor')->equals($companyId)
->field('interactionDate')->gte($start)
->group(['company' => 'company'], ['count' => 0])
->reduce('function (obj, prev) { prev.count++; }');
$query = $qb->getQuery();
$results = $query->execute()->toArray();
$ids = [];
foreach ($results as $result) {
if ($result['count'] > 1) {
$ids[] = (string) $result['company'];
}
}
return $ids;
}https://stackoverflow.com/questions/42936533
复制相似问题