Агрегация Parse Server с использованием PHP SDK - PullRequest
0 голосов
/ 15 февраля 2019

Я пытаюсь создать запрос агрегации в PHP SDK Parse, и я застрял в области «поиска», я видел пример JS по этому поводу, но он не работает в моем случае.

У меня есть таблица пользователей, которая содержит поле «Теги» типа Array, массив на самом деле представляет собой массив указателей, которые указывают на отдельный класс Tag.

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

Вот что у меня есть в данный момент:

$query = new ParseQuery('_User');
$pipeline = [
    'project' => ['tags' => 1],
    'unwind' => '$tags',
    'group' => [
        'objectId' => '$tags.objectId',
        'count' => ['$sum' => 1]
    ],
    'sort' => [ 'count' => -1],
    'limit' => 10,
];
try {
    return $query->aggregate($pipeline);
} catch (ParseException $ex) {
    return $ex->getMessage();
}

А вот фрагмент того, как выглядит коллекция _User:

{ 
    "_id" : "5BuBVo2GD0", 
    "email" : "test@test.com", 
    "username" : "test@test.com", 
    "lastname" : "Doe", 
    "firstname" : "John", 
    "_created_at" : ISODate("2017-01-23T09:20:11.483+0000"), 
    "_updated_at" : ISODate("2019-02-15T02:48:30.684+0000"), 
    "tags" : [
        {
            "__type" : "Pointer", 
            "className" : "Tag", 
            "objectId" : "St2gzaFnTr"
        }, 
        {
            "__type" : "Pointer", 
            "className" : "Tag", 
            "objectId" : "LSVxAy2o74"
        }
    ], 
    "_p_country" : "Country$4SE8J4HRBi", 
}

И коллекция тегов выглядит следующим образом:

{ 
    "_id" : "St2gzaFnTr", 
    "name" : "Music", 
    "_created_at" : ISODate("2018-10-22T20:00:10.481+0000"), 
    "_updated_at" : ISODate("2018-10-22T20:00:10.481+0000")
}

Любая помощь будет признательна!

Заранее спасибо

1 Ответ

0 голосов
/ 25 февраля 2019

Не уверен, что это прямой ответ, но вот рабочая агрегация по сортировке тегов по частоте ...

public function tagHistogram(Request $request, Response $response, array $args): Response {
        $pipeline = [
             'unwind' => '$tags' ,
             'sortByCount' => '$tags',
             'limit' => 1000,
        ];

        $query = new ParseQuery('Product');
        $result = $query->aggregate($pipeline);
        $result = array_map(
            function ($e) {
                $e['name'] = $e['objectId'];
                unset($e['objectId']);
                return $e;
            },
            $result
        );

        return $response->withJson($result);
    }
...