【问题标题】:Aggregation error in Spring Data MongoDBSpring Data MongoDB中的聚合错误
【发布时间】:2014-01-30 02:22:24
【问题描述】:

我目前正在为我的大学项目编写一个 web 应用程序。这是一个允许创建、修改和进行语言测试的系统。我的老师对我的问题搜索模块很感兴趣。对于数据库,我使用 MongoDB。他问我如果浏览器中有 5kk 条记录可以查看怎么办?他建议我在 MongoDB 中进行一些聚合。

我必须制定一种搜索方法,允许我从集合文档中按 1 到 5 个条件进行搜索:类别、问题、难度、问题类型、正确答案的数量。当然也可以在浏览器中查看。

起初我尝试了一些基本操作,例如使用条件进行新查询,但我需要它处理任意数量的条件,而不是全部或一个条件。如果 1 个或多个字段为空,则不应在搜索中考虑它们,因此我正在尝试进行聚合,但我无法使其正常工作,也不知道我要完成的是否是偶数可以用这个方法。

这是我的问题。在 DAO 中,我尝试定义一个聚合,但它不识别组和类的方法(方法未定义)。

这是我的代码:

    public List<Question> findQuestions(Question question) {
    String questionPattern = question.getQuestion().length() == 0 ? ".*" : ".*" + question.getQuestion() + ".*";

    TypedAggregation<Question> agg = newAggregation(Question.class, group("category"),
            match(where("category").is(question.getCategory()))

        );

        AggregationResults<Question> result = mongoTemplate.aggregate(agg, Question.class);
        List<Question> stateStatsList = result.getMappedResults();
}

和 pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.pgs.languageskillchecker</groupId>
<artifactId>LanguageSkillChecker</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>LanguageSkillChecker</name>
<url>http://maven.apache.org</url>

<properties>
    <spring.version>3.1.2.RELEASE</spring.version>
</properties>

<dependencies>

    <!-- Spring -->

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

    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-config</artifactId>
        <version>3.1.2.RELEASE</version>
    </dependency>

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

    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-web</artifactId>
        <version>3.1.2.RELEASE</version>
    </dependency>

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

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-aspects</artifactId>
        <version>3.1.2.RELEASE</version>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
        <version>3.2.3.RELEASE</version>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>3.2.3.RELEASE</version>
    </dependency>

    <!-- Velocity -->

    <dependency>
        <groupId>org.apache.velocity</groupId>
        <artifactId>velocity</artifactId>
        <version>1.7</version>
    </dependency>

    <!-- Jackson -->

    <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-mapper-asl</artifactId>
        <version>1.9.12</version>
    </dependency>

    <!-- Servlet -->

    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>servlet-api</artifactId>
        <version>2.5</version>
    </dependency>

    <!-- MongoDB -->    

    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-mongodb</artifactId>
        <version>1.3.3.RELEASE</version>
    </dependency>

    <!-- Sitemesh -->

    <dependency>
        <groupId>org.sitemesh</groupId>
        <artifactId>sitemesh</artifactId>
        <version>3.0-alpha-1</version>
    </dependency>

    <!-- AspectJ -->

    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjrt</artifactId>
        <version>1.6.10</version>
    </dependency>

    <!-- poi -->

    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>3.9</version>
    </dependency>

    <!-- File upload -->

    <dependency>
        <groupId>commons-fileupload</groupId>
        <artifactId>commons-fileupload</artifactId>
        <version>1.3</version>
    </dependency>

</dependencies>

<build>
    <finalName>LanguageSkillChecker</finalName>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.1</version>
            <configuration>
                <source>1.7</source>
                <target>1.7</target>
            </configuration>
        </plugin>
    </plugins>
</build>

我当然会导入所需的库:

import org.springframework.data.mongodb.core.aggregation.AggregationResults;
import org.springframework.data.mongodb.core.aggregation.TypedAggregation;
import org.springframework.data.mongodb.core.aggregation.Aggregation.*;

我从 Spring IO Docs 中获取了聚合代码,但我无法让它正常工作。我会很感激任何帮助^^

【问题讨论】:

  • 你可以先说你的实际问题是什么。
  • 我必须制定一种搜索方法,允许我从数据库中按 1 到 5 个条件进行搜索:类别、问题、难度、问题类型、正确答案的数量。
  • 你以什么方式失败了?
  • 起初我尝试了一些基本操作,比如使用条件进行新查询,但我需要它来处理任意数量的条件,而不是全部或一个。如果 1 个或多个字段为空,则不应在搜索中考虑它们,因此我正在尝试进行聚合,但我无法使其正常工作,也不知道我要完成的是否是偶数可以用这种方法。

标签: java spring mongodb spring-mvc


【解决方案1】:

这是我的问题。在 DAO 中,我尝试定义一个聚合,但它 不识别组和类的方法(方法是 未定义)。

这些方法(where 和 group)是 static 并在 Criteria 和 Aggregation 类中定义 - 您只是缺少 static 导入。

import static org.springframework.data.mongodb.core.aggregation.Aggregation.*;
import static org.springframework.data.mongodb.core.query.Criteria.*;

或者更具体的

import static org.springframework.data.mongodb.core.aggregation.Aggregation.group;
import static org.springframework.data.mongodb.core.query.Criteria.where;

【讨论】:

    【解决方案2】:

    您应该看看 Spring Data Specifications 和 Querydsl,google 帮助您找到如何根据动态条件范围创建自定义搜索的示例。

    http://spring.io/blog/2011/04/26/advanced-spring-data-jpa-specifications-and-querydsl/

    【讨论】:

    • 感谢您的提示。我会调查的。
    猜你喜欢
    • 2019-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多