Laravel MongoDB группы в сочетании с где в

0

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

    $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 so weird~",
    "category_id": "578489618a8920afcb3f4de2",
    "updated_at": ISODate("2016-07-12T07:16:50.512Z"),
    "created_at": ISODate("2016-07-12T07:16:50.512Z")
}

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

Теперь группировка и сортировка уже работают, просто не удается отфильтровать определенную категорию

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

| User  | Total posts |
|-------|-------------|
| Smith | 11          |
| Ivy   | 8           |
| Paul  | 3           |
  • 0
    Можете ли вы предоставить документ из коллекции, которую вы пытаетесь запросить? Можете ли вы поставить результат, который вы хотите отобразить позже?
  • 0
    @suecarmol уже обновляет структуру документа
Показать ещё 1 комментарий
Теги:
group-by
where-in

1 ответ

2
Лучший ответ

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

<?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.
Я должен сделать трюк!

  • 0
    Благодарю. Это то, что я ищу

Ещё вопросы

Сообщество Overcoder
Наверх
Меню