Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

400
Vistas
Cómo pasar una variable php vacía en la consulta mongodb

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

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

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 ],] ])
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda