es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Consulta de MongoDB para devolver todo basado en el tamaño de una matriz después de filtrar la matriz.

Estoy intentando crear una plantilla para una consulta de búsqueda de Mongo que devuelva todos los valores que coincidan con el tamaño dado de una propiedad de matriz. Por ejemplo, esta es la consulta para encontrar todos los documentos que contienen una matriz de tamaño 5:

{ arrayProperty: { $size: 5} }

El problema: algunas de estas matrices tienen un valor de “nil” y no quiero que se cuenten estos valores al consultar el tamaño. Por ejemplo, me gustaría que se devolviera un documento que contenga una matriz estructurada de esta manera al consultar por un tamaño de 5:

[0,1,2,3,”nil”]

Ya estoy haciendo algo como esto en el marco de agregación:

[
{
$project: {
item: 1,
numberOfItems: { $size: {
$filter: {
input: “$arrayProperty”,
cond: { $ne: [ “$$this”, “nil” ] }
}
}
}
}
}
]

Esto cuenta la longitud/tamaño de cada una de las matrices y empuja ese número a una matriz llamada numberOfItems. Creo que necesito pasar resultados filtrados al operador $size. Sin embargo, no puedo lograr aprovechar esto en la sintaxis de la consulta de búsqueda y estoy desesperado por recibir ayuda.

La idea que tengo en mente para el flujo que describí es algo como esto, aunque esto no es válido:

{$expr:{
  $filter: {
    input: "$arrayProperty",
    cond: { $ne: [ "$$this", "nil" ] }
  }: { $size: 5 }
}}

¿Alguien puede ayudarme? ¿Cómo paso correctamente un resultado filtrado al operador $size? No puedo encontrar ninguna otra pregunta/respuesta donde la gente haya intentado hacer algo similar.

La otra situación es cuando “nil” está anidado como un valor en un objeto JSON en una matriz, lo que sé que requerirá una solución diferente. Ejemplo:

[
{
“arrayProperty”: [
{
“model”: “sedan”,
“turbo”: “nil”
},
{
“model”: “sedan”,
“turbo”: “60cc”
}
]
},
{
“arrayProperty”: [
{
“model”: “coupe”,
“turbo”: “50cc”
},
{
“model”: “coupe”,
“turbo”: “60cc”
}
]
}
]

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    ¿Alguien puede ayudarme con esto también?

    Puede usar el operador $expr para filtrar los valores nil de la propiedad de matriz y luego usar el operador $size para obtener el tamaño de la matriz. Por ejemplo, la consulta para la primera situación sería:

    {$expr:{
      $size: {
        $filter: {
          input: "$arrayProperty",
          cond: { $ne: [ "$$this", "nil" ] }
        }
      }
    }}
    

    Para la segunda situación, puede usar el operador $map para filtrar los valores nil de la propiedad de matriz y luego usar el operador $size para obtener el tamaño de la matriz. Por ejemplo, la consulta para la segunda situación sería:

    {$expr:{
      $size: {
        $map: {
          input: "$arrayProperty",
          as: "item",
          in: {
            $cond: [
              { $ne: [ "$$item.turbo", "nil" ] },
              "$$item",
              false
            ]
          }
        }
      }
    }}
    

Comments are closed.