简体   繁体   中英

how to aggregate mongodb collection data in laravel

i have collection like this

 {
    "wl_total" : 380,
    "player_id" : 1241,
    "username" : "Robin",
    "hand_id" : 292656,
    "time" : 1429871584
}
{
    "wl_total" : -400,
    "player_id" : 1243,
    "username" : "a",
    "hand_id" : 292656,
    "time" : 1429871584
}

as both collection have same hand_id i want to aggregate both these collection on the basis of hand_id i want result as combine of

data=array(
       'hand_id'=>292656,
        'wl_total'=>
                   {
                    0=>380,
                    1=>-400
                   },
         'username'=>
                   {
                    0=>"Robin",
                    1=>"a"
                   },
          "time"=>1429871584
     )

You basically want a $group by the "hand_id" common to all players, and then $push to different arrays in the document and then also do something with "time", I took $max . Nees to be an accumulator of some sort at any rate.

Also not sure what your underlying collection name is, but you can call this in laravel with a construct like this:

$result = DB::collection('collection_name')->raw(function($collection)
{
    return $collection->aggregate(array(
        array(
            '$group' => array(
                '_id' => '$hand_id',
                'wl_total' => array(
                    '$push' => '$wl_total'
                ),
                'username' => array(
                    '$push' => '$username'
                ),
                'time' => array( 
                    '$max' => '$time'
                )
            )
        )   
    ));
});

Which returns output ( shown in json ) like this:

{
        "_id" : 292656,
        "wl_total" : [
                380,
                -400
        ],
        "username" : [
                "Robin",
                "a"
        ],
        "time" : 1429871584
}

Personally I would have gone for a single array with all the infomation in it for the grouped "hand", but I supose you have your reasons why you want it this way.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM