使用PHP变量在MongoDB中聚合

时间:2017-04-10 05:33:02

标签: php mongodb variables mongodb-query aggregation-framework

我一直在尝试使用PHP变量从mongoDB数据库中获取结果。

这有效:

//create Mongo connection
$m = new MongoClient();

//Select db
$db = $m->warehouse;

//create collection
$fact = $db->fact;
$res = $fact->aggregate([
    array(
        '$match'=>array(
            'day'=>array('$gte'=>3,'$lte'=>28),
            'month'=>array('$gte'=>3,'$lte'=>3),
            'year'=>array('$gte'=>2017,'$lte'=>2017)
        )
    ),
    array(
        '$group'=>array(
            '_id'=>array(
                'month'=>'$month',
                'day'=>'$day',
                'year'=>'$year'
            ), 
            'totalSales'=>array('$sum'=>'$sale'), 
            'totalCost'=>array('$sum'=>'$total_cost')
        )
    ), 
    array(
        '$project'=>array(
            '_id'=>0,
            'totalSales'=>1,
            'totalCost'=>1,
            'totalProfit'=>array(
                '$subtract'=>['$totalSales','$totalCost']
            )
        )
    )
]);

var_dump($ res)的输出:

array (size=3)
'waitedMS' => int 0
'result' => 
array (size=1)
  0 => 
    array (size=3)
      'totalSales' => float 440
      'totalCost' => float 350
      'totalProfit' => float 90
'ok' => float 1

但是当我尝试用php变量替换数字时:

$res = $fact->aggregate([
    array(
        '$match'=>array(
            'day'=>array('$gte'=>$dayfrom,'$lte'=>$dayto),
            'month'=>array('$gte'=>$monthfrom,'$lte'=>$monthto),
            'year'=>array('$gte'=>$yearfrom,'$lte'=>$yearto)
        )
    ),
    array(
        '$group'=>array(
            '_id'=>array(
                'month'=>'$month',
                'day'=>'$day',
                'year'=>'$year'
            ), 
            'totalSales'=>array('$sum'=>'$sale'), 
            'totalCost'=>array('$sum'=>'$total_cost')
        )
    ), 
    array(
        '$project'=>array(
            '_id'=>0,
            'totalSales'=>1,
            'totalCost'=>1,
            'totalProfit'=>array(
                '$subtract'=>['$totalSales','$totalCost']
            )
        )
    )
]);

我没有收到任何结果:

array (size=3)
'waitedMS' => int 0
'result' => 
array (size=0)
  empty
'ok' => float 1

我在这里做错了什么?我已经尝试了几个方法,比如将PHP变量放在单引号下或​​者尝试将部分查询放入字符串中,并使用这些字符串重新构建查询,但除了硬编码数字到聚合外似乎没有任何工作。知道这里发生了什么吗?

编辑:(这就行了) 尝试在PHP类构造函数中初始化变量,该构造函数显式指定值来自PHP变量:

class DateSet {
public $df;
public $dt;
public $mf;
public $mt;
public $yf;
public $yt;

function __construct( $df, $dt, $mf, $mt, $yf, $yt) {
    $this->df = $df;
    $this->dt = $dt;
    $this->mf = $mf;
    $this->mt = $mt;
    $this->yf = $yf;
    $this->yt = $yt;
}
};

$dateobj = new DateSet($dayfrom,$dayto,$monthfrom,$monthto,$yearfrom,$yearto);

$res = $fact->aggregate([
    array(
        '$match'=>array(
            'day'=>array('$gte'=>$dateobj->df,'$lte'=>$dateobj->dt),
            'month'=>array('$gte'=>$dateobj->mf,'$lte'=>$dateobj->mt),
            'year'=>array('$gte'=>$dateobj->yf,'$lte'=>$dateobj->yt)
        )
    ),
    array(
        '$group'=>array(
            '_id'=>array(
                'month'=>'$month',
                'day'=>'$day',
                'year'=>'$year'
            ), 
            'totalSales'=>array('$sum'=>'$sale'), 
            'totalCost'=>array('$sum'=>'$total_cost')
        )
    ), 
    array(
        '$project'=>array(
            '_id'=>0,
            'totalSales'=>1,
            'totalCost'=>1,
            'totalProfit'=>array(
                '$subtract'=>['$totalSales','$totalCost']
            )
        )
    )
]);

输出:

array (size=3)
'waitedMS' => int 0
'result' => 
array (size=7)
  0 => 
    array (size=3)
      'totalSales' => float 640
      'totalCost' => float 520
      'totalProfit' => float 120
  1 => 
    array (size=3)
      'totalSales' => float 8000
      'totalCost' => float 6000
      'totalProfit' => float 2000
  2 => 
    array (size=3)
      'totalSales' => float 700
      'totalCost' => float 600
      'totalProfit' => float 100
  3 => 
    array (size=3)
      'totalSales' => float 18000
      'totalCost' => float 15000
      'totalProfit' => float 3000
  4 => 
    array (size=3)
      'totalSales' => float 6300
      'totalCost' => float 6100
      'totalProfit' => float 200
  5 => 
    array (size=3)
      'totalSales' => float 68503
      'totalCost' => float 55720
      'totalProfit' => float 12783
  6 => 
    array (size=3)
      'totalSales' => float 440
      'totalCost' => float 350
      'totalProfit' => float 90
 'ok' => float 1

0 个答案:

没有答案