0

这里是 MongoDB 的新手,我很难做到这一点。我有一个数据库,其中包含一个名为帖子的集合。它具有以下结构(最简单的形式):

{
    "_id": ObjectId
    "title" : String
    "content" : String
    "comments" : Array
}

将 PHP 与新的 MongoDB 驱动程序一起使用,我希望运行一个查询,该查询返回按评论数量排列的文档。我使用了以下代码,但我不确定这是否是正确的方法:

$cursor = $collection->find([],
    [
        'sort' => [ 'comments' => - 1 ]
    ]
);

任何帮助都感激不尽!感谢社区!

4

2 回答 2

2

您应该能够使用使用$size 运算符计算评论数量的投影阶段来使用聚合框架,然后添加排序阶段。但是,这可能会非常慢,因为每次查询时都必须计算计数......所以......如果你经常想要这个,你可能想要预先计算评论的数量并创建一个基于索引在预先计算的数字上。类似于以下内容:

db.col.aggregate([{$project: ... "numberOfComments" : 
   {$size : "$comments"},
 {$sort : { numberOfComments : -1 }}])
于 2018-02-06T12:45:54.173 回答
0

感谢@mmroman,我找到了解决方案。它让我尝试了几次让它与 PHP 语法一起工作。这里是。我已经简化了它,希望它可以帮助寻找相同的人。

$pipeline = [ // Github considered wrapping the pipeline in an array like so
    [
        '$match' => [ // Use match to limit results (better performance)
            'comments' => [ '$exists' => true ] // Work only on posts with comments
        ]
    ],
    [
        '$project' => [
            '_id'          => 1, // 1 = returns field to result, 0 = does not 
            'id'           => 1,
            'from'         => 1,
            'created_time' => 1,
            'commentCount' => [ '$size' => '$comments' ] // commentCount can be anything and $comments is the field that has the array you want to count
        ] 
    ],
    [ '$sort' => [ 'commentCount' => - 1 ] ],
    [ '$limit' => 5 ] // Limit to the 5 top. You can change this per your satisfaction
];

// Then finally pipe the line to the aggegate
$cursor = $collection->aggregate(
    $pipeline
);

希望这对其他人有帮助!

问候,

于 2018-02-06T14:15:22.343 回答