Mehdi Alikhani
Mehdi Alikhani

Reputation: 141

Laravel Mongodb aggregate match is not working

I'm trying to get users posts with mongodb in laravel, this query is working fine in mongodb shell but it's not working in laravel and it gives me this error :

A pipeline stage specification object must contain exactly one field.

this is my query in mongodb shell :

db.instaPosts.aggregate([ 
 {"$match" :{ "userid" : "1507073550"}}, 

{"$group" : 
{ "_id" : "$post.location.id", 
"location" : {"$first":"$post.location.name"},

"count":{ "$sum" : 1}}} 
])

and this the results :

{ "_id" : null, "location" : null, "count" : 7 }
{ "_id" : "332558707", "location" : "Daryache Chitgar,Tehran,Iran", "count" : 1 }
{ "_id" : "250445386", "location" : "دانشگاه علم و فرهنگ", "count" : 1 }
{ "_id" : "1343757649052341", "location" : "Agor Caffe", "count" : 1 }
{ "_id" : "111106416225578", "location" : "Santiago Bernabeu, Madrid", "count" : 1 }
{ "_id" : "506047058", "location" : "Cardiff City Stadium", "count" : 1 }

and this is my controller :

        $places = Posts::raw(function ($collection){
            return $collection->aggregate([
               [
                   '$match' => [
                           'userid' => [ '$eq' => '1507073550']
                   ],
                    '$group'=> [
                        '_id' => '$post.location.id',
                        'location' => [
                            '$first'=>'$post.location.name'
                        ],
                        'total' => [
                            '$sum' => 1
                        ],
                    ]
               ]
            ]);
        });

exact same things! but it's not working.

Upvotes: 0

Views: 1500

Answers (1)

Mehdi Alikhani
Mehdi Alikhani

Reputation: 141

Finally found the solution!

        $places = Posts::raw(function ($collection){
            return $collection->aggregate([
               [
                   [
                   '$match' => [
                           'userid' => [ '$eq' => '1507073550']
                      ],
                   ],
                   [
                    '$group'=> [
                        '_id' => '$post.location.id',
                        'location' => [
                            '$first'=>'$post.location.name'
                        ],
                        'total' => [
                            '$sum' => 1
                        ],
                      ]
                   ]
               ]
            ]);
        });

I should've wrap $match and $group with [] ,

Upvotes: 1

Related Questions