Как получить доступ к поддокументу в mongoDB с условием в программе весенней загрузки - PullRequest
0 голосов
/ 09 июня 2019

Я хочу написать программу начальной загрузки, чтобы получить значения имени, идентификатора и ключа, где abc.active равен true.Я написал некоторый код

@Repository
public interface SwitchRepoDao extends MongoRepository< SwitchRepo, String> {
     public List<SwitchRepo> findByAbc_active(boolean active);
}

, также я написал класс для интерфейса.

@Document(collection="switchrepo")
public class SwitchRepo{

    @Id
    private String id;
    private String type;
    private List<Abc> abc;
    // with getters and setters also constructors.

И Abc - это класс.

public class Abc{

    private String name;
    private String id;
    private String key;
    private boolean active;

Это кодЯ использую для отображения вывода.

    @Bean
    CommandLineRunner runner(SwitchRepoDao switchRepoDao) {
        return new CommandLineRunner() {
            @Override
            public void run(String... args) throws Exception {          



                Iterable<SwitchRepo> personList = switchRepoDao.findAllWithStatus(true);
                System.out.println("Configuration : ");
                for (SwitchRepo config : personList)
        {
                System.out.println(config.getRegistries().toString());
        }

            }
        };
    }

Может кто-нибудь, пожалуйста, помогите мне с этим.По любому вопросу, связанному с запросом, оставьте комментарий.Заранее спасибо.

Ниже приведена коллекция MongoDB из теста базы данных.и имя коллекции - switchrepo.

"_id" : "1234567890",
    "type" : "xyz",
    "abc" : [ 
        {
            "name" : "test",
            "id" : "test1",
            "key" : "secret",
            "active" : true
        }, 
        {
            "name" : "test2",
            "id" : "test12",
            "key" : "secret2",
            "active" : false
        }
    ]
}

В ответ мне нужно вывести как

        "id" : "test1",
        "key" : "secret",
        "active" : true

, поскольку active в этом массиве поддокументов имеет значение true.

Actual Resultчто я получил это "abc" : [{"name" : "test","id" : "test1","key" : "secret","active" : true},{"name" : "test2","id" : "test12","key" : "secret2","active" : false}]

1 Ответ

0 голосов
/ 09 июня 2019

Вы не можете использовать свойства-выражения для свойства, когда тип поля - Массив.

здесь решения с использованием @Query или Aggregations

Решение 1 (Использование @Query)

@Repository
public interface SwitchRepoDao extends MongoRepository< SwitchRepo, String> {
 //public List<SwitchRepo> findByAbc_active(boolean active);

 @Query(value = "{ 'abc.active' : ?0}", fields = "{ 'abc' : 1 }")
 List<SwitchRepo> findAllWithStatus(Boolean status);

}

{ 'abc.active' : ?0}  for filtring

{ 'abc' : 1 }         for only return that part of the document (abc).

Вызов findAllWithStatus вернет все SwitchRepo, по крайней мере, с одним ABC с активным значением true, вам необходимо выполнить фильтрацию (с помощью фильтра потоков java 8 для примеров, когда все нет активного Abc из массива)

Решение 2 (Использование агрегации Mongodb)

Создать новый класс dto

import java.util.List;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;

@Document(collection="switchrepo")
public class SwitchRepoDto {

  @Id
  private String id;
  private String type;
  private Abc abc;
// with getters and setters also constructors.


  public SwitchRepoDto() {
  }

  public String getId() {
    return id;
  }

  public void setId(String id) {
    this.id = id;
  }

  public String getType() {
    return type;
  }

  public void setType(String type) {
    this.type = type;
  }

  public Abc getAbc() {
    return abc;
  }

  public void setAbc(Abc abc) {
    this.abc = abc;
  }
}

Создание пользовательского метода Добавление пользовательского метода в репозиторий или добавление MongoOperations в уровень обслуживания.

    @Autowired
    private MongoOperations mongoOperations;

    public List<SwitchRepoDto> findAllActive() {

        UnwindOperation unwind =  Aggregation.unwind("$abc");
        MatchOperation match = Aggregation.match(Criteria.where("abc.active").is(true));
        Aggregation aggregation = Aggregation.newAggregation(unwind,match);
        AggregationResults<SwitchRepoDto> results = mongoOperations.aggregate(aggregation, SwitchRepoDto.class, SwitchRepoDto.class);
        List<SwitchRepoDto> mappedResults = results.getMappedResults();

        return mappedResults;

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...