Aggregate lookup on array of pointers is returning empty array for lookups
khalilsarabey opened this issue · 3 comments
Issue Description
Hello,
I'm trying to create a function that returns the top most popular tags used by users, but I keep getting an empty array for the lookup.
The way the data is saved is like the following:
I have a a Tag class and a _User class. inside the _User class, I have a Tags field of type array, and it contains an array of pointers for each user, the pointers of course point to the "Tag" class.
$query = new ParseQuery('_User');
$pipeline = [
'project' => ['tags' => 1],
'unwind' => '$tags',
'group' => [
'objectId' => '$tags.objectId',
'count' => ['$sum' => 1]
],
'lookup' => [
'from' => 'Tag',
'localField' => 'objectId',
'foreignField' => '_id',
'as' => 'tags'
],
'sort' => [ 'count' => -1],
'limit' => 10,
];
try {
return $query->aggregate($pipeline);
} catch (ParseException $ex) {
return $ex->getMessage();
}
I tried multiple things but I keep getting the same results, not sure if it's a bug in the PHP SDK or I'm doing something wrong.
As a reference, here's a snippet of both Schema classes:
User class:
{
"_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",
}
Tag class:
{
"_id" : "St2gzaFnTr",
"name" : "Music",
"_created_at" : ISODate("2018-10-22T20:00:10.481+0000"),
"_updated_at" : ISODate("2018-10-22T20:00:10.481+0000")
}
I'm running Parse version 2.8.2 cause NodeChef didn't upgrade Parse that's running on their server.
PHP version is: 7.0
The PHP SDK version is: 1.5.1
And the MongoDB version is: 3.4.4
Thanks
I was able to make this work.
For anyone who faced an issue here's the pipeline:
$pipeline = [
'project' => ['tags' => 1],
'unwind' => '$tags',
'lookup' => [
'from' => 'Tag',
'localField' => 'tags.objectId',
'foreignField' => '_id',
'as' => 'popular'
],
'group' => [
'objectId' => '$popular',
'count' => ['$sum' => 1]
],
'sort' => [ 'count' => -1],
'limit' => 10,
];
Would love to know if there's any way we can create stages with the same name, for instance I would like to use 'project' twice in the above pipeline
can create stages with the same name
This isn't supported in the SDK. We could use a 2D array instead of an associate array for it.
I can do a PR for it.
can create stages with the same name
This isn't supported in the SDK. We could use a 2D array instead of an associate array for it.
I can do a PR for it.
I think that would be great man, sometimes stages with the same name are important, for instance what I have is good, but it would be great if I clean it up with another project stage.