有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何检查值是否至少等于列表中的一个字段?

我有这样的方法:

for (String fieldName : fieldArray) {
        Query query = new Query();
        query.addCriteria(Criteria.where("data." + fieldName).is("some_constant"));
        if (mongoTemplate.find(query, DataPoint.class).size() > 0) {
            return true;
      }
}
return false;

这段代码看起来效率很低,因为它访问数据库的大小太大了

有没有办法用单个查询替换它


共 (2) 个答案

  1. # 1 楼答案

    我觉得你可以用^{}

    应该是这样的:

    List<Criteria> criterias = new ArrayList<>();
    for (String fieldName : fieldArray) {
        //Create the criterias like you want
        criterias.add(Criteria.where("data." + fieldName).is("some_constant"));
    }
    
    Query query = new Query(
        new Criteria().orOperator(
            criterias.toArray( //convert the list into an Criteria[] for the varargs parameter
                new Criteria[criterias.size()]
            )
        )
    );
    

    这将创建一个Criteria列表,用于生成一个条件实例,如果一个条件有效(或一个操作,一个true就足够了),该实例将有效

  2. # 2 楼答案

    为什么不使用Criteria::in方法并传递一个列表,而不是迭代所有元素并逐个元素进行检查,我认为您只需要以下内容:

    query.addCriteria(
      Criteria.where("data." + fieldName).in(fieldArray)
    );
    

    除了@Veeram的注释外,如果您想检查一个字段是否可以保存列表中的一个值,第一种方法也可以,但您的问题似乎不同,据我所知,您想检查多个字段中的值出口,要解决这个问题,您可以使用:

    //Consider you want to check in multiple fields
    List<String> fieldArray = Arrays.asList("field1", "field2", "field3");
    
    // First you have to create a list of Criteria (multiple conditions)
    List<Criteria> listOfCondition = new ArrayList<>();
    for (String fieldName : fieldArray) {
        listOfCondition.add(
                Criteria.where("data." + fieldName).is("some_constant")
        );
    }
    
    //The add them to the query.
    Criteria criteria = new Criteria();
    for (Criteria c : listOfCondition) {
        criteria = criteria.orOperator(c);
    }
    Query query = new Query();
    query.addCriteria(criteria);
    //Then execute your query just one time
    

    对于流,您可以使用:

    List<String> fieldArray = Arrays.asList("field1", "field2", "field3");
    Criteria principaleCriteria = new Criteria();
    fieldArray.stream()
            .map(fieldName -> Criteria.where("data." + fieldName).is("some_constant"))
            .forEach(criteria -> principaleCriteria.orOperator(criteria));
    Query query = new Query();
    query.addCriteria(principaleCriteria);
    return mongoTemplate.count(query, DataPoint.class) > 0;
    

    虽然在运行代码时技术上是正确的,但是

    org.springframework.data.mongodb.InvalidMongoDbApiUsageException: Due to limitations of the com.mongodb.BasicDBObject, you can't add a second '$or' expression specified as '$or : [ { "data.field2" : "some_constant"}]'. Criteria already contains '$or : [ { "data.field1" : "some_constant"}]'.

    符合Mongodb的代码:

    List<String> fieldArray = Arrays.asList("field1", "field2", "field3");
    Criteria principaleCriteria = new Criteria();
    List<Criteria> orExpressions = fieldArray.stream()
                    .map(fieldName -> Criteria.where("data." + fieldName).is("some_constant"))
                    .collect(toList());
    Query query = new Query();
            query.addCriteria(principaleCriteria.orOperator(orExpressions.toArray(new Criteria[orExpressions.size()])));
    

    产出:

    { "$or" : [ { "data.field1" : "some_constant"} , { "data.field2" : "some_constant"} , { "data.field3" : "some_constant"}]}