sql >> Base de Datos >  >> NoSQL >> MongoDB

Agregación de Mongo frente a Java para bucle y rendimiento

Con Aggregation, toda la consulta se ejecuta como un solo proceso en el servidor MongoDB:el programa de aplicación obtendrá el cursor de resultados del servidor.

Con el programa Java también obtiene un cursor del servidor de la base de datos como entrada para el procesamiento en la aplicación. El cursor de respuesta del servidor será un conjunto de datos más grande y utilizará más ancho de banda de red. Y luego está el procesamiento en el programa de aplicación, y esto agrega más pasos para completar la consulta.

Creo que la opción de agregación es una mejor opción, ya que todo el procesamiento (la coincidencia inicial y el filtrado de la matriz) ocurre en el servidor de la base de datos como un solo proceso.

Además, tenga en cuenta que los pasos de consulta de agregación que ha publicado se pueden realizar de manera eficiente. En lugar de varias etapas (2, 3, 4 y 5), puede realizar esas operaciones en dos etapas - usa un $project con $map en la matriz externa y luego $filter en la matriz interna y luego $filter la matriz exterior.

La agregación:

db.test.aggregate( [
  { 
      $addFields: { 
          Field2: { 
              $map: {
                   input: "$Field2",
                      as: "fld2",
                      in: {
                           Field3: "$$fld2.Field3",
                           Field4: { 
                               $filter: {
                                   input: "$$fld2.Field4",
                                      as: "fld4",
                                    cond: {  $eq: [ "$$fld4.id", "123" ] }
                               }
                           }
                       }
                 } 
          }
      }
  },
  { 
      $addFields: { 
          Field2: { 
              $filter: {
                   input: "$Field2",
                      as: "f2",
                    cond: {  $gt: [ { $size: "$$f2.Field4" }, 0 ] }
              }
          }
      }
  },
] )