Репозиторий MongoDB - Агрегирование - Шаблон Mongo не работает - PullRequest
0 голосов
/ 26 апреля 2018

Я пытаюсь выполнить агрегацию с хранилищем MongoDB. Я использовал эти учебники: https://www.mkyong.com/mongodb/spring-data-mongodb-aggregation-grouping-example/ и https://docs.spring.io/spring-data/mongodb/docs/current/reference/html/#mongo.group. Но ни один из них не работает, и я не знаю, в чем проблема. Мой репозиторий выглядит так:

import java.math.BigInteger;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort;
import org.springframework.data.domain.Sort.Direction;

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

import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.aggregation.Aggregation;
import org.springframework.data.mongodb.core.aggregation.AggregationResults;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.repository.Query;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface StudentRepository extends CrudRepository<MongoStudent, String> {

    @Autowired
    MongoTemplate mongoTemplate;

    Aggregation agg = newAggregation(project("studium"), unwind("studium"), group("studium").count().as("n"),
            project("n").and("studium").previousOperation(), sort(Sort.Direction.DESC, "total"));

    AggregationResults<MongoTable> results = MongoTemplate.aggregate(agg, "studium", MongoTable.class);
    List<MongoTable> mappedResult = results.getMappedResults();

}

и MongoTable выглядят так:

class MongoTable {

@Id
BigInteger id;
@Field
String skratka;
@Field
String zaciatok_studia;
@Field
int n;

...getter,setters, etc

Проблема в том, что MongoTemplate выдает мне ошибку Cannot make a static reference to the non-static method aggregate(Aggregation, String, Class<MongoTable>) from the type MongoTemplate, и когда я пытаюсь изменить все импортные операции на статический, он выдает мне: The static import org.springframework.data.mongodb.core.MongoTemplate must be a field or member type, а когда я изменяю MongoTemplate.aggregate(agg, "studia", MongoTable.class); на mongoTemplate.aggregate(agg, "studia", MongoTable.class);, это дает мне: The blank final field mongoTemplate may not have been initialized Я не знаю Не знаю, что еще попробовать. Любая помощь?

Есть конфиг:

@EnableMongoRepositories
@Configuration
@ComponentScan(basePackages = "com.nosql")
public class MongoConfig extends AbstractMongoConfiguration{

    static MongoClient mongo = null;

      @Bean("applicationTemplate")
      @Qualifier("applicationTemplate")
      public MongoTemplate mongoTemplate(
          final MappingMongoConverter mappingMongoConverter, final MongoClient mongoClient) {
        final String databaseName = mongo.getDatabase("mynosqlproject").getName();

        final MongoDbFactory dbFactory = new SimpleMongoDbFactory(mongoClient, databaseName);
        return new MongoTemplate(dbFactory, mappingMongoConverter);
      }

    @Override
    public MongoClient mongoClient() {
        // Creating a Mongo client
                MongoClientURI uri = new MongoClientURI(
                        "mongodb://xxx:xxx/mynosqlproject");
                 mongo = new MongoClient(uri);
                 return mongo;
    }

    @Override
    protected String getDatabaseName() {
                return mongo.getDatabase("mynosqlproject").getName();
    }

}

ОБНОВЛЕНИЕ: Итак, у меня есть новые классы в моем проекте.

public class AggregationRepository {

    Aggregation agg = newAggregation( unwind("studium"), group("course","start").count().as("n"), sort(Sort.Direction.DESC,"n"));

    @Autowired
    MongoTemplate mongoTemplate;

    AggregationResults<MongoTable> results = mongoTemplate.aggregate(agg, "studium",MongoTable.class);
    List<MongoTable> mappedResult = results.getMappedResults();


}

И класс обслуживания.

@Service
public class StudentService {

    @Autowired
    private StudentRepository repository;
    private AggregationRepository repository2;

    public void saveData() {
            ....

    }

    public void findStudentsFromYear() {
        ....

    }

    public void findStudentsDromCourse() {
        ......
    }

    public void AggreagationTable() {
        List<MongoTable> mappedResult = repository2.mappedResult;
        mappedResult.forEach(System.out::println);

    }

}

Проблема в том, что он все еще не работает. Это дает мне nullpointer исключение на System.out.println(repository2.mappedResult); Похоже, проблема в AggregationRepository. Агрегация агг работает нормально, но mongoTemplate имеет значение null. что я скучаю?

1 Ответ

0 голосов
/ 26 апреля 2018

Измените интерфейс StudentRepository на простой Java-класс и удалите extends CrudRepository и добавьте метод, который возвращает:

List<MongoTable> 

Вы пытаетесь внедрить bean-компонент в интерфейс, следовательно, вы получили исключение:

The blank final field mongoTemplate may not have been initialized
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...