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

How do I group by on a dbref in MongoDB with Doctrine

我想做一个聚合查询,我可以在其中按 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'。我该如何查询?

经过大量搜索,我发现这个 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();

这个查询给了我正确的预期结果。