2017-05-17 1 views
0

Je rencontre un problème lors de mappage Résultat lors de l'utilisation des opérations de déroulement dans l'agrégation.getMappedResults() ne mappe pas correctement le résultat brut

Voici mes dépendances. Ci-dessous la dépendance que j'ai mentionné les deux classes de modèle que j'utilise avec le code d'agrégation à la fin. J'obtiens des données dans le résultat dans la requête native aussi bien que dans la requête Spring. Mais la différence est que le résultat de la requête Spring même si a des documents, le tableau orgMap est vide. Alors que le document renvoyé par la requête native a une donnée pour chaque document dans le tableau orgMap.

<dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-core</artifactId> 
      <version>4.3.7.RELEASE</version> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-context</artifactId> 
      <version>4.3.7.RELEASE</version> 
     </dependency> 

     <!-- mongodb java driver --> 
     <dependency> 
      <groupId>org.mongodb</groupId> 
      <artifactId>mongo-java-driver</artifactId> 
      <version>3.0.0</version> 
     </dependency> 

     <!-- Spring data mongodb --> 
     <dependency> 
      <groupId>org.springframework.data</groupId> 
      <artifactId>spring-data-mongodb</artifactId> 
      <version>1.10.3.RELEASE</version> 
     </dependency> 





     package com.mongodb.model.user; 

     import java.util.HashSet; 
     import org.springframework.data.annotation.Id; 
     import org.springframework.data.annotation.PersistenceConstructor; 
     import org.springframework.data.mongodb.core.mapping.Document; 
     import com.alta.mongodb.model.user.UserOrgMap; 

     @Document(collection = "users") 

     public class Users { 

      public Users() { 
       super(); 
      } 

      @PersistenceConstructor 
      public Users(String userId, String login, String firstName, String lastName, 
        HashSet<UserOrg> userOrg) { 
       super(); 
       this.userId = userId; 
       this.login = login; 
       this.firstName = firstName; 
       this.lastName = lastName; 
       this.userOrgMap = userOrgMap; 
      } 

      @Id 
      private String userId; 
      private String login; 
      private String firstName; 
      private String lastName; 
      private HashSet<UserOrgMap> userOrgMap; 


      public String getUserId() { 
       return userId; 
      } 
      public void setUserId(String userId) { 
       this.userId = userId; 
      } 
      public String getLogin() { 
       return login; 
      } 
      public void setLogin(String login) { 
       this.login = login; 
      } 
      public String getFirstName() { 
       return firstName; 
      } 
      public void setFirstName(String firstName) { 
       this.firstName = firstName; 
      } 
      public String getLastName() { 
       return lastName; 
      } 
      public void setLastName(String lastName) { 
       this.lastName = lastName; 
      } 

      public HashSet<UserOrgMap> getUserOrgMap() { 
       return userOrgMap; 
      } 
      public void setUserOrgMap(HashSet<UserOrgMap> userOrgMap) { 
       this.userOrgMap = userOrgMap; 
      } 

      @Override 
      public int hashCode() { 
       final int prime = 31; 
       int result = 1; 
       result = prime * result + ((firstName == null) ? 0 : firstName.hashCode()); 
       result = prime * result + ((lastName == null) ? 0 : lastName.hashCode()); 
       result = prime * result + ((login == null) ? 0 : login.hashCode()); 
       result = prime * result + ((userId == null) ? 0 : userId.hashCode()); 
       result = prime * result + ((userOrgMap == null) ? 0 : userOrgMap.hashCode()); 
       return result; 
      } 

      @Override 
      public boolean equals(Object obj) { 
       if (this == obj) 
        return true; 
       if (obj == null) 
        return false; 
       if (getClass() != obj.getClass()) 
        return false; 
       Users other = (Users) obj; 
       if (firstName == null) { 
        if (other.firstName != null) 
         return false; 
       } else if (!firstName.equals(other.firstName)) 
        return false; 
       if (lastName == null) { 
        if (other.lastName != null) 
         return false; 
       } else if (!lastName.equals(other.lastName)) 
        return false; 
       if (login == null) { 
        if (other.login != null) 
         return false; 
       } else if (!login.equals(other.login)) 
        return false; 
       if (userId == null) { 
        if (other.userId != null) 
         return false; 
       } else if (!userId.equals(other.userId)) 
        return false; 
       if (userOrgMap == null) { 
        if (other.userOrgMap != null) 
         return false; 
       } else if (!userOrgMap.equals(other.userOrgMap)) 
        return false; 
       return true; 
      } 

      @Override 
      public String toString() { 
       return "Users [userId=" + userId + ", login=" + login + ", firstName=" + firstName + ", lastName=" + lastName 
         + ", userOrgMap=" + userOrgMap + "]"; 
      } 


     } 

    package com.mongodb.model.user; 

    import org.springframework.data.annotation.PersistenceConstructor; 

    public class UserOrg { 



     private String orgId; 
     private String createdbyuser; 

     public UserOrg() { 
      super(); 
     } 

     public UserOrg(String orgId, String createdbyuser) { 
      super(); 
      this.orgId = orgId; 
      this.createdbyuser = createdbyuser; 
     } 

     public String getOrgId() { 
      return orgId; 
     } 

     public void setOrgId(String orgId) { 
      this.orgId = orgId; 
     } 

     public String getCreatedbyuser() { 
      return createdbyuser; 
     } 

     public void setCreatedbyuser(String createdbyuser) { 
      this.createdbyuser = createdbyuser; 
     } 



     @Override 
     public int hashCode() { 
      final int prime = 31; 
      int result = 1; 
      result = prime * result + ((createdbyuser == null) ? 0 : createdbyuser.hashCode()); 
      result = prime * result + ((orgId == null) ? 0 : orgId.hashCode()); 
      return result; 
     } 

     @Override 
     public boolean equals(Object obj) { 
      if (this == obj) 
       return true; 
      if (obj == null) 
       return false; 
      if (getClass() != obj.getClass()) 
       return false; 
      UserOrg other = (UserOrg) obj; 
      if (createdbyuser == null) { 
       if (other.createdbyuser != null) 
        return false; 
      } else if (!createdbyuser.equals(other.createdbyuser)) 
       return false; 
      if (orgId == null) { 
       if (other.orgId != null) 
        return false; 
      } else if (!orgId.equals(other.orgId)) 
       return false; 

      return true; 
     } 

     @Override 
     public String toString() { 
      return "UserOrg [orgId=" + orgId + ", createdbyuser=" + createdbyuser + "]"; 
     } 




    } 

Aggregation aggregation = newAggregation(
       unwind("userOrgMap") 
      ); 


     AggregationResults<User> groupResults = mongoOperation.aggregate(aggregation,"users", User.class); 

     System.out.println(" groupResults raw result "+groupResults.getRawResults().get("result")); 

     List<User> result = groupResults.getMappedResults(); 

System.out.println(" result "+result); 


Output : 
groupResults raw result 

[ { "_id" : "user_1" , "login" : "123" , "firstName" : "abc" , "lastName" : "xyz" , "userOrgMap" : { "orgId" : "org_1" , "createdbyuser" : "user_2" } , 
    { "_id" : "user_2" , "login" : "789" , "firstName" : "qqq" , "lastName" : "aaa" , "userOrgMap" : { "orgId" : "org_1" , "createdbyuser" : "user_3" } 
] 



result 

[ 
    User [userId=user_1, login=123, firstName=abc, lastName=xyz, userOrgMap=[] ], 
    User [userId=user_2, login=789, firstName=qqq, lastName=aaa, userOrgMap=[],] 
] 


I want to know why userOrgMap array is empty instead of having value similar to the output shown for raw results. 
+0

Vous attendez 'le document userOrgMap' à la carte type de collection qui est impossible et donc retour du printemps comme tableau vide. Vous pouvez créer un 'userDTO' avec' userOrgMap' comme 'UserOrg' au lieu de' Set 'et d'autres champs. Cela devrait correspondre correctement. Btw, je ne suis pas sûr de savoir pourquoi le mapper à 'users'class. Je peux vous aider davantage si vous pouvez partager exactement ce que vous essayez d'accomplir. – Veeram

+0

Le modèle utilisateur réel a beaucoup d'attributs. Ce que j'avais posté est une version minifiée de celui-ci. Dans ma mise en œuvre actuelle, c'est userOrgMap. Mais encore l'arry est vide. – karmaker

+0

Mon exigence est de dérouler un tableau à l'intérieur d'un document et obtenir plusieurs documents mappés au modèle de document. – karmaker

Répondre

0

userOrgMap pas un tableau dans le résultat brut, mais un seul document.

Vous avez deux options.

Ajouter un champ userOrgMapuserOrgMapSingle supplémentaire dans User modèle et ajoutez l'alias unwind comme userOrgMapSingle dans la requête d'agrégation.

Ou

Ajouter project étape pour convertir le document unique en tableau avec un seul document pour la cartographie à un type de collection userOrgMap existant.

Quelque chose comme

{$project:{userOrgMap:["$userOrgMap"]}} 

Spring Mongo données équivalent

Aggregation aggregation = newAggregation(
      unwind("userOrgMap"), 
      new AggregationOperation() { 
       @Override 
       public DBObject toDBObject(AggregationOperationContext aggregationOperationContext) { 
       return new BasicDBObject("$addFields", new BasicDBObject("userOrgMap", Arrays.asList("$userOrgMap"))); 
      } 
     } 
); 
+0

Merci pour l'info. Je préfère la deuxième approche car je n'ai pas besoin de modifier le modèle utilisateur. Puis-je connaître l'équivalent SpringData pour la requête native mentionnée ci-dessus? – karmaker

+0

Bonjour, sauriez-vous la réponse à cette question? http://stackoverflow.com/questions/44041506/how-to-check-that-a-user-has-aloted-voted-on-a-post – Coder1000

+0

@karmaker Vous êtes les bienvenus. Je ne trouve aucune méthode api standard pour cela, donc j'ai utilisé 'AggregationOperation' avec' BasicDBObject' pour ajouter l'étape d'agrégation '$ addFields'. Je mettrai à jour la réponse si je trouve la méthode api. – Veeram