2016-07-25 19 views
0

Ich habe die folgende Abfrage in MongoDB arbeiten, aber es funktioniert nicht in PHP. MongoDB AbfrageConverting MongoDB Abfrage mit Aggregat zu PHP-Treiber Aggregat Abfrage

db.energy_meter.aggregate(
{ 
    $unwind: { 
     path:"$KeyValues", 
     includeArrayIndex:"arrayIndex", 
     preserveNullAndEmptyArrays:true 
    } 
}, 
{ 
    $project: { 
     timestamp:{ 
      "$add":["$EventTS",{"$multiply":[60000,"$arrayIndex"]}] 
     } , 
     "RPhaseVoltage":"$KeyValues.RPhaseVoltage", 
     arrayIndex:1, 
     } 
} 
); 

Above Abfrage in PHP umgewandelt wird

$cursor = DB::collection('energy_meter')->raw(function($collection) 
       { 
        return $collection->aggregate([     
         [ 
          '$unwind' => 
           ['path' => '$KeyValues'], 
           ['includeArrayIndex' => 'arrayIndex'], 
           ['preserveNullAndEmptyArrays' => 'true'] 
         ], 

         [ 
          '$project' => 
           [ 
            'timestamp' => [ 
             '$add' => [ 
               '$EventTS', 
               ['$multiply' => [60000, '$arrayIndex']] 
             ] 
            ] 
           ], 
           [ 
            'MainsInputVoltagev' => ['$KeyValues.MainsInputVoltagev'] 
           ], 
           [ 
            'arrayIndex' => 1 
           ] 
         ] 
        ]); 
       }); 

Ich erhalte folgenden Fehler

RuntimeException in Aggregate.php line 168: A pipeline stage specification object must contain exactly one field. 

Was Problem in meiner konvertierte php Abfrage ist? Bitte schlagen Sie die Lösung des obigen Problems vor.

Antwort

0

Sie sollten die normale Abfrage immer in die Array-Decodierung konvertieren. json_decode sollte eine Abfrage für den PHP-Treiber machen und json_encode sollte Abfrage-mongodb-Abfrageparameter geben.

(
{ 
    $unwind: { 
     path:"$KeyValues", 
     includeArrayIndex:"arrayIndex", 
     preserveNullAndEmptyArrays:true 
    } 
}, 
{ 
    $project: { 
     timestamp:{ 
      "$add":["$EventTS",{"$multiply":[60000,"$arrayIndex"]}] 
     } , 
     "RPhaseVoltage":"$KeyValues.RPhaseVoltage", 
     arrayIndex:1, 
     } 
    } 
) 

So:

array(
    array(
    '$unwind' => array(
     'path' => '$KeyValues', 
     'includeArrayIndex' =>"arrayIndex", 
     'preserveNullAndEmptyArrays'=> true 
    ) 
    ), 
    array(
    '$project' => array(
     'timestamp' => array( 
      '$add'=>[ '$EventTS',array('$multiply'=>[60000,'$arrayIndex'])] 
     ) , 
     "RPhaseVoltage" => '$KeyValues.RPhaseVoltage', 
     'arrayIndex' =>1, 
    ) 
    ) 
) 

Wenn Sie mindestens PHP5.4 haben, können Sie einfacher Array-Syntax verwenden. Ersetzen Sie array( durch [ und ) durch ] für Array.

[     
    [ 
     '$unwind' => [ 
      'path' => '$KeyValues', 
      'includeArrayIndex' => 'arrayIndex', 
      'preserveNullAndEmptyArrays' => 'true' 
     ] 
    ], 
    [ 
     '$project' => [ 
      'timestamp' => [ 
       '$add' => [ 
         '$EventTS', 
         [ '$multiply' => [60000, '$arrayIndex'] ] 
       ] 
      ], 
      'MainsInputVoltagev' => '$KeyValues.MainsInputVoltagev', 
      'arrayIndex' => 1 
     ] 
    ] 
] 
Verwandte Themen