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

标签 mongodb aggregation-framework spring-data-mongodb

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

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

关于mongodb - getMappedResults() 没有正确映射原始结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44029579/

相关文章:

python - 类型错误 : object of type 'Cursor' has no len()

javascript - 如何在 MongoDB shell 中将 NumberLong 转换为 Date?

mongodb - 多组 - 对数组内的每个值进行平均,而不会与另一个文档重复

node.js - MongoDB/Mongoose 查询 : How to get different sets of data based on a field's value

javascript - 按日期与MongoDB中的本地时区分组

elasticsearch - Elasticsearch 在Spring Boot应用程序中不起作用

java - Spring Data MongoDB 是否支持 MongoDB 3.4 整理功能?

mongodb - React Native 上的 Realm Sync 离线优先 : how to implement?

node.js - 在 MongoDB 中查询具有非空数组交集的文档

spring-data-mongodb - MongoDB Spring Data Criteria Not运算符