使用聚合将MongoDB查询转换为PHP的问题

时间:2014-08-09 19:12:56

标签: php mongodb laravel-4

我有以下(工作)MongoDB查询来生成一个hashtag计数列表。

db.twitter.aggregate([
    { 
        $group: { 
            _id: "$status.entities.hashtags.text", 
            hashtags: { 
                $addToSet : "$status.entities.hashtags.text" 
            }
        }
    },
    { $unwind : "$hashtags" }, 
    { $unwind : "$hashtags" },
    { $group : { _id : "$hashtags", count: { $sum : 1 } } },
    { $sort : { count : -1, _id : 1 } }
]);

现在我尝试将此查询转换为PHP代码(用于laravel):

$cursor = DB::collection('twitter')->raw(function($collection)
{
    return $collection->aggregate(array(
        array(
            '$group' => array(
                '_id' => '$status.entities.hashtags.text', 
                'hashtags' => array(
                    '$addToSet' => '$status.entities.hashtags.text',
                ),
            ),
        ),
        array(
            '$unwind' => '$hashtags',
        ),
        array(
            '$unwind' => '$hashtags',
        ),
        array(
            '$group' => array(
                '_id' => '$hashtags', '
                count' => array(
                    '$sum => 1',
                ),
            ),
        ),
        array(
            '$sort' => array(
                'count' => '-1', 
                '_id' => '1',
            ),
        ),
    ));
});

dd($cursor);

我可以从Laravel-MongoDB docs得到的是原始查询输入与PHP mongodb中的相同。

返回的错误是:

MongoResultException (15951)

localhost:27017: exception: the group aggregate field 'count' must be defined as an expression inside an object

2 个答案:

答案 0 :(得分:1)

重写了数组,现在它可以工作:

$cursor = DB::collection('twitter')->raw(function($collection)
{
    return $collection->aggregate([
        [ 
            '$group' => [ 
                '_id' => '$status.entities.hashtags.text', 
                'hashtags' => [
                    '$addToSet' => '$status.entities.hashtags.text'
                ]
            ]
        ],
        [ '$unwind' => '$hashtags' ], 
        [ '$unwind' => '$hashtags' ],
        [ '$group' => [ '_id' => [ '$toLower' => '$hashtags' ], 'count' => [ '$sum' => 1 ] ] ],
        [ '$sort' => [ 'count' => -1, '_id' => 1 ] ]
    ]);
});

刚刚将{}替换为[]而将:替换为=>,这样就可以了!

答案 1 :(得分:1)

你解决了这个问题,但我可以告诉你你哪里错了:

'$sum => 1',

应该是:

array('$sum' => 1)