如何使用Doctrine在MongoDB中的dbref上进行分组

时间:2017-11-02 09:44:56

标签: php mongodb doctrine-orm doctrine-odm

我想进行聚合查询,我可以通过dbref进行分组。这就是我尝试过的。

$aggregation = array(
    array(
        '$group' => array(
            '_id' => '$foreign.$id',
            'doc' => array(
                '$last' => '$$ROOT'
            )
        )
    ),
    array(
        '$sort' => array(
            'date' => -1
        )
    )
);

return $this->getDocumentManager()->getDocumentCollection('AppBundle:Collection')->aggregate($aggregation)->toArray();

但是这次尝试失败了,因为您不允许在$中使用第二个'$foreign.$id'符号。我该怎么做这个查询?

1 个答案:

答案 0 :(得分:1)

经过大量搜索,我发现这个Bug Ticket on the monogdb Jira基本上处理了这个/类似的问题。

此票证上的last comment提供了一种解决方法,可以将此问题作为命令行代码解决。我已经采用这个解决方案并将其构建成一个解决我问题的聚合查询。

$aggregation = array(
    array(
        '$addFields' => array(
            'foreignId' => array(
                '$arrayToObject' => array(
                    '$map' => array(
                        'input' => array(
                            '$objectToArray' => '$foreign'
                        ),
                        'in' => array(
                            'k' => array(
                                '$cond' => array(
                                    array(
                                        '$eq' => array(
                                            array(
                                                '$substrCP' => array(
                                                    '$$this.k', 0, 1
                                                )
                                            ),
                                            array(
                                                '$literal' => '$'
                                            )
                                        )
                                    ),
                                    array(
                                        '$substrCP' => array(
                                            '$$this.k',1,['$strLenCP' => '$$this.k']
                                        )
                                    ),
                                    '$$this.k'
                                )
                            ),
                            'v' => '$$this.v'
                        )
                    )
                )
            )
        )
    ),
    array(
        '$group' => array(
            '_id' => '$foreignId',
            'doc' => array(
                '$last' => '$$ROOT'
            )
        )
    ),
    array(
        '$sort' => array(
            'date' => -1
        )
    )
);
$this->getDocumentManager()->getDocumentCollection('AppBundle:Collection')->aggregate($aggregation)->toArray();

此查询为我提供了正确和预期的结果。