Quiero crear una consulta mongodb dinámica que inserte cada parte de su agregación si la condición es verdadera; de lo contrario, no inyecte esa parte.
Por ejemplo, quiero verificar si la hora es entre la 1 a. m. y las 8 a. m. En caso afirmativo, pase la matriz definida a la consulta 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 ] ] ] ]); }); Pero en este ejemplo, inyectará un valor nulo en la consulta y lo hará mal y obtendré un error: bad query: BadValue: $or/$and/$nor entries need to be full objects
Lo he cambiado a $this->N_IN_1_8 = ''; todavía sin éxito.
Todo lo que necesito es pasar una variable o condición neutral que no afecte la consulta si la condición es falsa. ¿Alguna idea?
FYI: estoy usando el marco Laravel 5.3 con el paquete jenssegers/laravel-mongodb para trabajar con mongodb
Prefiriendo mantener la estructura del código como está, es decir, cuando no se usa una matriz preconstruida en el código de condición, puede mantener $MidnightCheck como null y envolver la matriz con 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 ]) ] // ... Llamar array_filter sin un segundo argumento filtrará todos los valores falsos de la matriz, lo que hará que desaparezca el $MidnightCheck no deseado.
Lo que creo que podría ser más claro sería preparar previamente las condiciones en la devolución de llamada:
$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 ],] ])