getMappedResults() 没有正确映射原始结果

getMappedResults() doesn't map correctly the raw result

在聚合中使用展开操作时,我在获取映射结果时遇到问题。

以下是我的依赖项。在依赖项下面,我提到了我最后使用聚合代码的两个模型 类。我在本机查询和 Spring 查询中获取结果数据。但不同的是 Spring 查询结果虽然有文档,但 orgMap 数组是空的。而本机查询返回的文档对于 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. 

userOrgMap 不是原始结果中的数组,而是单个文档。

你有两个选择。

User 模型中添加一个额外的字段 userOrgMap userOrgMapSingle 并在聚合查询中添加 unwind 别名作为 userOrgMapSingle

添加 project 阶段以将单个文档转换为数组,并使用单个文档将其映射到现有的 userOrgMap 集合类型。

类似于

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

Spring Mongo 等效数据

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