按照PHP中Array Field的大小对Mongodb集合进行排序

By simon at 2018-02-07 • 0人收藏 • 36人看过

这里是MongoDB的新手,我很难做到这一点。我有一个 数据库与收集称为​​职位。它有fol下降结构(in 这是最简单的形式):

{
    "_id": ObjectId
    "title" : String
    "content" : String
    "comments" : Array
}
使用PHP与新的MongoDB驱动程序,我希望运行一个查询返回文件按评论数排列。我使用了下面的代码,但我 我不确定这是否是正确的做法:
$cursor = $collection->find([],
    [
        'sort' => [ 'comments' => - 1 ]
    ]
);
任何帮助都感激不尽!谢谢SO社区!

3 个回复 | 最后更新于 2018-02-07
2018-02-07   #1

您应该能够使用投影阶段使用聚合框架 它使用[$ si计算注释的数量泽 操作者(https://docs.mongodb.com/manual/reference/operator/aggregation/size/ “$ size操作符”),然后添加一个[sort STAGE(https://docs.mongodb.com/manual/reference/operator/aggregation/sort/ “分类阶段”)。但是,这可能会是terr因为太慢了 每次查询时必须计算一次计数...所以...如果你想要的话 往往你可能想要预先压缩请注释的数量,并创建一个索引 基于预先计算的数字。有些东西是:

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

2018-02-07   #2

您应该能够使用投影阶段使用聚合框架 它使用[$ si计算注释的数量泽 操作者(https://docs.mongodb.com/manual/reference/operator/aggregation/size/ “$ size操作符”),然后添加一个[sort STAGE(https://docs.mongodb.com/manual/reference/operator/aggregation/sort/ “分类阶段”)。但是,这可能会是terr因为太慢了 每次查询时必须计算一次计数...所以...如果你想要的话 往往你可能想要预先压缩请注释的数量,并创建一个索引 基于预先计算的数字。有些东西是:

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

2018-02-07   #3

感谢@ 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
);
希望这可以帮助别人! 问候,

登录后方可回帖

Loading...