按 PHP 中数组字段的大小对 Mongo 数据库集合进行排序

Sorting a Mongo DB collection by size of Array Field in PHP

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

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

使用 PHP 和新的 MongoDB 驱动程序,我希望 运行 查询 returns 按评论数排列的文档。我使用了以下代码,但我不确定这样做是否正确:

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

任何帮助将不胜感激!谢谢 SO 社区!

您应该能够通过投影阶段使用聚合框架,该阶段使用 the $size operator and then add a sort stage 计算评论数。但是,这可能会非常慢,因为每次查询时都必须计算计数......所以......如果你经常想要这个,你可能想要预先计算评论的数量并创建一个基于索引在预先计算的数字上。 大致如下:

db.col.aggregate([{$project: ... "numberOfComments" : 
   {$size : "$comments"},
 {$sort : { numberOfComments : -1 }}])

感谢@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
);

希望这对其他人有帮助!

此致,