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.

MongoDB buscar unir arreglo

Tengo una colección con datos que se ven más o menos así:

{
  "part": [
    { "a": "1", "b": "a" },
    { "a": "23", "b": "b" },
    { "a": "4", "b": "c" }
  ]
}

Lo que quiero es una forma de buscar documentos donde la unión de todas las partes “a” sea igual a la búsqueda que estoy buscando.

Por ejemplo, 1234 debería coincidir con el documento anterior, pero 124 no debería.

¿Es esto posible con MongoDB?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Sí, esto es posible con MongoDB utilizando el marco de agregación. Puede utilizar el operador $reduce para concatenar todos los valores del campo a en el array parte, y luego compararlo con el valor de búsqueda utilizando el operador $eq. Aquí tienes un ejemplo de consulta:

    db.collection.aggregate([
      {
        $match: {
          $expr: {
            $eq: [
              { $reduce: {
                input: "$parte.a",
                initialValue: "",
                in: { $concat: [ "$$valor", "$$this" ] }
              } },
              "1234"
            ]
          }
        }
      }
    ])
    

    Esta consulta utiliza la etapa $match para filtrar los documentos donde la concatenación de todos los valores del campo a en el array parte es igual al valor de búsqueda “1234”. El operador $reduce se utiliza para concatenar los valores, comenzando con una cadena vacía como valor inicial. El operador $concat se utiliza dentro del operador $reduce para concatenar cada valor a la cadena acumulada. Finalmente, el operador $eq se utiliza para comparar la cadena resultante con el valor de búsqueda.

    Ten en cuenta que esta consulta solo coincidirá con documentos donde todos los valores a en el array parte estén concatenados en el orden correcto. Si quieres permitir que los valores estén en cualquier orden, puedes ordenar el array antes de concatenarlo. Aquí tienes un ejemplo:

    db.collection.aggregate([
      {
        $match: {
          $expr: {
            $eq: [
              { $reduce: {
                input: { $sort: "$parte.a" },
                initialValue: "",
                in: { $concat: [ "$$valor", "$$this" ] }
              } },
              "1234"
            ]
          }
        }
      }
    ])
    

    En esta consulta, la input del operador $reduce se ordena primero por el campo a antes de concatenar los valores.

Comments are closed.