【问题标题】:Doctrine ODM - MongoDB groupingDoctrine ODM - MongoDB 分组
【发布时间】:2017-08-13 16:12:06
【问题描述】:

我正在尝试使用分组构建 Doctrine ODM 查询(我刚接触 Mongo,我有强大的 SQL 背景)。

我想获得在给定时间段内显示 2 次或更多的所有结果。

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();
}
}

【问题讨论】:

  • 你试过在 mongo shell 中写那个查询吗?
  • 您介意分享您的文档结构吗?

标签: php doctrine-orm mongodb-query doctrine-odm


【解决方案1】:

我找到了一些解决方法,可以满足我的需求,但我对它不满意,所以我仍在寻求解决最初问题的帮助。

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;
}

【讨论】:

    猜你喜欢
    • 2015-04-10
    • 1970-01-01
    • 1970-01-01
    • 2016-08-26
    • 2017-08-14
    • 1970-01-01
    • 2014-04-19
    • 2016-06-26
    • 2012-09-06
    相关资源
    最近更新 更多