phpnerd
phpnerd

Reputation: 926

How to subtract in mongodb php

 $getdataPipeline = array(
            array(
                '$match' => array(
                    'project_id' => array('$in' => $mysql_project_id) // Validating project ID
                ),
                '$match' => array('project_id' => $project_id)
            ),
            array(
                '$group' => array(
                    '_id' => array('pro_id' => '$project_id', 'uid' => '$user_id'),
                    "wh" => array('$subtract' => array(array('$sum' => '$toltal_timein_minutes'), array('$sum' => '$holding_durationin_minutes')))

                ))
        );

Running query:

  $ValidProjectIdInMongo = $collection->aggregate($getdataPipeline);

I'm getting an error like

Uncaught exception 'MongoResultException' with message 'localhost:27017: exception: unknown group operator '$subtract''

Upvotes: 1

Views: 997

Answers (1)

Blakes Seven
Blakes Seven

Reputation: 50406

The $sum is the accumulator to be used with $group, so it must be the top level operator used. Therefore your other operations need to happen "inside" the $sum:

$getdataPipeline = array(
    array(
        '$match' => array('project_id' => $project_id)
    ),
    array(
        '$group' => array(
            '_id' => array('pro_id' => '$project_id', 'uid' => '$user_id'),
            "wh" => array( 
                '$sum' => array( 
                    '$subtract' => array( 
                        '$toltal_timein_minutes', 
                        '$holding_durationin_minutes'
                    ) 
                ) 
            )
        )
    )
);

You can do it here because this is basic subtraction, but more complex operations would generally require a separate $project stage after the $group.

Also note that yout $match pipeline stage is incorrect and will actually be interpretted just as I have re-written above. You perhaps mean in $in condition for both the possible values, which is a logical $or.

You also have what looks like typing errors in the field names.

Upvotes: 3

Related Questions