MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Agrégation Mongo vs Java pour la boucle et les performances

Avec l'agrégation, toute la requête est exécutée en un seul processus sur le serveur MongoDB - le programme d'application obtiendra le curseur de résultats du serveur.

Avec le programme Java, vous obtenez également un curseur du serveur de base de données en tant qu'entrée pour le traitement dans l'application. Le curseur de réponse du serveur va être un plus grand ensemble de données et utilisera plus de bande passante réseau. Et puis il y a le traitement dans le programme d'application, et cela ajoute plus d'étapes pour terminer la requête.

Je pense que l'option d'agrégation est un meilleur choix - car tout le traitement (la correspondance initiale et le filtrage du tableau) se produit sur le serveur de base de données en un seul processus.

Notez également que les étapes de requête d'agrégation que vous avez publiées peuvent être effectuées de manière efficace. Au lieu de plusieurs étapes (2, 3, 4 et 5), vous pouvez effectuer ces opérations en deux étapes - utiliser un $project avec $map sur le tableau externe puis $filter sur le tableau interne puis $filter le tableau extérieur.

L'agrégation :

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 ] }
              }
          }
      }
  },
] )