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.

La etapa geoNear debe ser la primera.

¡Hola, he estado jugando con el API geo de MongoDB y parece bastante limitado, especialmente la limitación que no permite ejecutar ninguna otra etapa antes que él. Solo he encontrado una posible solución $facet, pero también limita la etapa geoNear, así que me quedo sin opciones. Lo que necesito es usar la etapa $match antes de $geoNear, sé que $geoNear tiene su propia consulta pero las coordenadas de geoNear aquí en mi código actual son las siguientes:

  {
    $match: {/*consulta*/},
  },
  {
    $geoNear: {
      near: {
        type: 'Point',
        coordinates: '$geometry.coordinates' as unknown as [number, number],
      },
      distanceField: 'dist.calculated',
      maxDistance: 1000000,
      includeLocs: 'dist.location',
      spherical: true,
    },
  },

Sé que esto no es un error, sino una característica según dicen los colaboradores de MongoDB, pero realmente necesito encontrar una forma de evitar esto de alguna manera y realizar primero la coincidencia.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Una solución a esta limitación es usar la etapa $lookup con una sub-pipeline para realizar la operación $match inicial antes de la etapa $geoNear.

    La nueva pipeline se vería algo así:

    [
      {
        $lookup: {
          from: 'nombreColeccion',
          let: { coordinates: '$geometry.coordinates' },
          pipeline: [
            {
              $match: {/*consulta*/}
            },
            {
              $geoNear: {
                near: {
                  type: 'Point',
                  coordinates: '$$coordinates',
                },
                distanceField: 'dist.calculated',
                maxDistance: 1000000,
                includeLocs: 'dist.location',
                spherical: true,
              }
            }
          ],
          as: 'results'
        }
      }
    ]
    

    De esta manera, la etapa $match inicial se realiza dentro de la sub-pipeline antes de la etapa $geoNear, y los resultados se devuelven como un array en el campo results del documento.

    Tenga en cuenta que este enfoque puede no ser tan eficiente como usar la etapa nativa $geoNear, por lo que se debe probar exhaustivamente para asegurarse de que cumpla con los requisitos de rendimiento necesarios.

Comments are closed.