当前位置: 首页 > 知识库问答 >
问题:

如何在spring-boot程序中用条件访问mongoDB中的子文档

拓拔俊艾
2023-03-14

我想写一个spring-boot程序来获取name、id和key的值,其中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.
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());
        }

            }
        };
    }
"_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。

我得到的实际结果是“abc”:[{“name”:“test”,“id”:“test1”,“key”:“secret”,“active”:true},{“name”:“test2”,“id”:“test12”,“key”:“secret2”,“active”:false}]

共有1个答案

澹台鸿熙
2023-03-14

当字段类型为数组时,不能对proprety使用属性表达式。

这里使用@Query或聚合的解决方案

解决方案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).
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;

}
 类似资料:
  • 我正在使用Spring Boot和Spring data jpa。我也在使用hibernate envers,我需要访问AuditReaderFactory,以便我可以编写审计查询。 因为它是Spring Boot和spring数据jpa,所以一切都是自动配置的。所以当我这么做的时候, 它不起作用。我得到以下错误。 如何在我的存储库类中获得对AuditReaderFactory的正确引用?

  • 我想访问application.properties中提供的值,例如: 我想在Spring Boot应用程序中访问主程序中的userBucket.path

  • 来自OpenJDK的Dockerfile:8-jdk-alpine ADD target/.war admin_portal.war ENTRYPOINT[“java”,“-jar”,“admin_portal.war”]来自OpenJDK的Dockerfile:8-jdk-alpine ADD target/.war ui_app.war ENTRYPOINT[“java”,“-jar”,“ui

  • 问题内容: 我想访问中提供的值,例如: 我想在Spring Boot应用程序的主程序中访问。 问题答案: 你可以使用批注并在使用的任何Spring bean中访问属性 Spring Boot文档的Externalized Configuration部分介绍了你可能需要的所有详细信息。

  • 我正在尝试访问src/main/Resources/XYZ/view文件夹中的xsd,其中XYZ/view文件夹是由我创建的,文件夹具有我需要进行xml验证的abc.xsd。 当我每次尝试访问xsd时,结果为null, 我试过了, 1) 2) 以及我为获取资源或类加载器等而进行的更多跟踪。 最后我得到了xsd, 文件文件 = 新文件(新类路径资源(“/src/main/resources/XYZ/

  • 我正在尝试在我的Spring Boot(1.2.0.m1)应用程序中设置HikariCP,这样我就可以使用它来代替Tomcat DBCP进行测试。我想在application.properties文件中配置连接池,就像使用Tomcat一样,但我不知道应该怎么做。我找到的所有示例都显示JavaConfig样式,或者使用单独的HikariCP属性文件。有人能帮我找出属性名称来在application.