Группа Laravel mongoDB в сочетании с тем, где в

Вот мой текущий код

    $results = Post::whereIn('category_id', $category_ids)
        ->raw(function($collection) {
            return $collection->aggregate([
                [   
                    '$group' => [
                        '_id' => '$user_id',
                        'count' => [
                            '$sum' => 1
                        ]   
                    ]   
                ],  
                [   
                    '$sort' => [
                        'count' => -1
                    ]   
                ],  
                [   
                    '$limit' => 10
                ],  
            ]); 
        });

Я пытаюсь получить сообщения, связанные с определенными категориями, но это $results возвращает все сообщения.

Как изменить это на where in + group by?

Изменить (2016-07-14 10:13)

Категория

{
    "_id": ObjectID("578489618a8920afcb3f4de2"),
    "updated_at": ISODate("2016-07-13T06:21:40.700Z"),
    "created_at": ISODate("2016-07-12T07:16:49.913Z"),
}

Опубликовать

{
    "_id": ObjectID("578499629a89202fcb3f4de3"),
    "user_id": "578299629989e02fcb3f4de3",
    "title": "How to deal with MongoDB",
    "category_id": "578489618a8920afcb3f4de2",
    "updated_at": ISODate("2016-07-12T07:16:50.512Z"),
    "created_at": ISODate("2016-07-12T07:16:50.512Z")
}

{
    "_id": ObjectID("578499629a89202fcb3f4de3"),
    "user_id": "578299629989e02fcb3f4de3",
    "title": "It's so weird~",
    "category_id": "578489618a8920afcb3f4de2",
    "updated_at": ISODate("2016-07-12T07:16:50.512Z"),
    "created_at": ISODate("2016-07-12T07:16:50.512Z")
}

Итак, 1 категория содержит несколько сообщений, я хочу перечислить, сколько сообщений у каждого пользователя, и отсортировать по убыванию.

Теперь группировка и сортировка уже работают, просто невозможно отфильтровать определенный category_id

Ожидаемый результат

| User  | Total posts |
|-------|-------------|
| Smith | 11          |
| Ivy   | 8           |
| Paul  | 3           |

person Js Lim    schedule 13.07.2016    source источник
comment
Не могли бы вы предоставить документ из коллекции, которую вы пытаетесь запросить? Не могли бы вы указать результат, который вы хотите отобразить после этого?   -  person suecarmol    schedule 13.07.2016
comment
@suecarmol уже обновляет структуру документа   -  person Js Lim    schedule 14.07.2016
comment
Однако довольно запутанный вопрос ... В первом разделе вы спросили, как фильтровать по категориям (или что-то в этом роде), а затем показали бессмысленный желаемый результат, который не имеет ничего общего с первой частью вопроса.   -  person felipsmartins    schedule 14.07.2016


Ответы (1)


Хорошо, основываясь на ваших (странных) коллекциях, и если я все правильно понял, это должно быть примерно так:

<?php 

$category_ids = []; //categories goes here

$results = Post::raw(function($collection) use ($category_ids) {
    return $collection->aggregate([
        //where in...
        [
            '$match' => [
                'category_id' => ['$in' => $category_ids]
            ]       
        ],  
        [   
            '$group' => [
                '_id' => '$user_id',
                'count' => ['$sum' => 1]   
            ]   
        ],  
        [   
            '$sort' => ['count' => -1]   
        ],  
        [   
            '$limit' => 10
        ],  
    ]); 
});

Первый этап конвейера использует $match и $in для фильтрации сообщений, где post.category_id находится в $category_ids.
Я должен сделать трюк!

person felipsmartins    schedule 14.07.2016