2017-01-01 5 views
5

条件が真ならば、その部分を挿入する動的mongodbクエリを作成したい、そうでなければその部分を挿入しないでください。mongodbクエリで空のphp変数を渡すには

たとえば、時刻が午前1時から午前8時までかどうかを確認したい場合は、定義済みの配列をmongodbクエリに渡します。それ以外の場合は何も渡しません。

if ($this->Not_in_1_8 == true) { 
    $this->N_IN_1_8 = array('dont_show_between_1_n_8' => array('$ne' => true)); 
}else { 
    $this->N_IN_1_8 = null; 
} 
$MidnightCheck = $this->N_IN_1_8; 
$this->campaign = Bcamp::raw(function ($collection) use ($seat_category_list, $banner_size, $seat_filter_list, $gold_network, $MidnightCheck) { 
    return $collection->aggregate([ 
     [ 
      '$match' => [ 
       '$and' => [ 
        ["targets.cats" => [ 
         '$in' => $seat_category_list 
         ] 
        ], 
        ['banners.' . $banner_size => [ 
         '$exists' => true 
         ] 
        ], 
        ['href' => [ 
         '$nin' => $seat_filter_list 
         ] 
        ], 
        ['targets.gold_network' => [ 
         '$eq' => $gold_network 
         ] 
        ], 
        ['status' => [ 
         '$ne' => "Low_Budget" 
         ] 
        ], 
        ['daily_budget_status' => [ 
         '$ne' => "Low_Budget" 
         ] 
        ], 
        $MidnightCheck 
       ] 
      ] 
     ], 
     [ 
      '$project' => [ 
       'ab' => [ 
        '$cmp' => [ 
         '$budget', '$click_cost' 
        ] 
       ] 
      ] 
     ], 
     [ 
      '$match' => [ 
       'ab' => [ 
        '$lt' => 1 
       ] 
      ] 
     ] 

    ]); 
}); 

しかし、この例では、クエリにnullを注入し、それが間違っになり、私はエラーをキャッチします:bad query: BadValue: $or/$and/$nor entries need to be full objects

私はまだ$this->N_IN_1_8 = '';に何の成功を、それを変更していません。

すべて条件が偽の場合、クエリに影響を与えない、中立の変数または条件が必要です。 アイデア?私は事前に構築された配列が条件で使用されていない場合と同様にコードの構造を維持するためにPrefering MongoDBの

答えて

1

で作業するための パッケージがある。すなわちjenssegers/laravel-のMongoDBでLaravel 5.3フレームワークを使用しています:FYI

コード、あなたはnullとして$MidnightCheckを維持し、array_filterで配列をラップすることがあります。

return $collection->aggregate([ 
[ 
    '$match' => [ 
     '$and' => array_filter([ 
      ["targets.cats" => ['$in' => $seat_category_list]], 
      ['banners.' . $banner_size => ['$exists' => true]], 
      ['href' => ['$nin' => $seat_filter_list]], 
      ['targets.gold_network' => ['$eq' => $gold_network]], 
      ['status' => ['$ne' => "Low_Budget"]], 
      ['daily_budget_status' => ['$ne' => "Low_Budget"]], 
      $MidnightCheck 
     ]) 
    ] 
// ... 

第二引数なしarray_filterを呼び出すと、不要な$MidnightCheckが消えてしまいます引き起こし、配列からすべての偽の値を除外します。

私は明確かもしれないと思うことは、コールバックに条件を事前に準備することです:あなたの教育の答えのための

$conditions = [ 
    ["targets.cats" => ['$in' => $seat_category_list]], 
    ['banners.' . $banner_size => ['$exists' => true]], 
    ['href' => ['$nin' => $seat_filter_list]], 
    ['targets.gold_network' => ['$eq' => $gold_network]], 
    ['status' => ['$ne' => "Low_Budget"]], 
    ['daily_budget_status' => ['$ne' => "Low_Budget"]], 
]; 
if ($MidnighCheck) { 
    $conditions[] = $MidnightCheck; 
} 
return $collection->aggregate([ 
    ['$match' => [ '$and' => $conditions ],] 
]) 
+0

おかげで - しかし、私は2番目のオプションで行くとき、私は得る:Aggregate.phpライン93を: $パイプラインはリストではありません(予期しないインデックス: "$ match") –

+0

ありがとうございました! – malarzm