programing

Spring Data MongoDB에서 쿼리에 대한 특정 필드만 반환하는 방법은 무엇입니까?

muds 2023. 6. 25. 20:36
반응형

Spring Data MongoDB에서 쿼리에 대한 특정 필드만 반환하는 방법은 무엇입니까?

Spring Data Mongo에서 특정 필드를 선택하려면 어떻게 해야 합니까?저는 다음을 시도했지만 캐스팅 예외를 받았습니다.Foo로.String.

사용.@Query

@Query(value="{path : ?0}", fields="{path : 0}")
String findPathByPath(String path);

@Query

String findPathByPath(String path);

다음은 문서 모델입니다.

@Document(collection = "foo")
public class Foo  {

  String name, path;
  …
}

MongoDB는 표준 쿼리에 대한 JSON 문서만 반환합니다.원하는 항목을 계속 반환하여 얻을 수 있습니다.List<Foo>.그fields의 재산.@Query1로 설정된 필드만 반환됩니다.

@Query(value="{ path : ?0}", fields="{ path : 0 }")
List<Foo> findByPath(String path);

부분적으로 채워진 것을 방지하기 위해 일반적으로 전용 DTO를 도입하는 것이 좋습니다.Foo…에게 건네지는 것으로부터.save(…)결국.

또 다른 옵션은 집계 프레임워크를 사용하는 것이지만 이는 더 중요합니다.

사용할 수 있습니다.

Query query = new Query();

query.fields().include("path");

사용할 수 있습니다.

public interface PersonRepository extends MongoRepository<Person, String>

  @Query(value="{ 'firstname' : ?0 }",fields="{ 'firstname' : 1, 'lastname' : 1}")
  List<Person> findByThePersonsFirstname(String firstname);

}

스프링 데이터 설명서의 자세한 내용

아래 쿼리를 사용하여 특정 필드를 가져올 수 있습니다.

@Query(fields="{path : 1}")
Foo findPathByPath(String path);

DB에 있는 레코드

{
    "name" : "name2",
    "path" : "path2"
},
{
    "name" : "name3",
    "path" : "path3"
}

아래 쿼리는 경로=Path3인 경우 Foo 개체를 반환합니다.

{
    "name": null,
    "path": "path3"
}

필수 필드를 fieldName:1로 지정해야 하며 필요하지 않은 경우 0으로 지정해야 합니다.

컬렉션의 특정 개체에서 필드 값을 가져오려고 시도하는 동안 이 질문을 발견했습니다.제가 조사한 바로는 Mongo는 객체에서 특정 필드의 값만 기본적으로 반환하는 방법을 제공하지 않습니다. (SQL이나 JSONPath처럼 필드에서 특정 값만 반환할 수 있는 것은 매우 기본적인 것처럼 보이기 때문에 실망스럽습니다.)

이 문제를 해결하기 위해 Java 11과 함께 Spring MongoDB를 사용하여 다음과 같은 방법을 작성했습니다.

import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.MongoTemplate; //not used, just showing which type the template is
import java.util.Arrays;
import static java.util.Objects.requireNonNull;

/**
 * Use this method to get a specific field from an object saved in Mongo. The objectId will be
 * the id of the object to fetch, and the fieldValueToReturn will be the field to return.
 *
 * @return the value of the provided field-path converted to the class type provided
 */
public <T> T getFieldValueById(String objectId, String fieldValueToReturn, String collectionName, Class<T> classTypeToReturn) {
    var query = new Query().addCriteria(Criteria.where("_id").is(objectId));
    query.fields().include(fieldValueToReturn);
    var result = mongoTemplate.findOne(query, org.bson.Document.class, collectionName);
    requireNonNull(result, "Did not find any documents with id '" + objectId + "' in collection: " + collectionName);
    return result.getEmbedded(Arrays.asList(fieldValueToReturn.split("\\.")), classTypeToReturn);
}

getEmbedded호출을 사용하면 반환된 Bson 문서 내의 중첩 필드 값을 가져올 수 있습니다.

메소드를 사용하려면 다음과 같이 부릅니다.

getFieldValueById("A1234", "field.nestedfield.nestedfield", "collectionName", String.class);

이것이 다른 누군가가 이것을 하는 방법을 찾는 데 도움이 되기를 바랍니다.


참고로, 저는 객체 목록을 반환하기 위해 이것을 확장하는 방법을 잘 모르겠습니다. 만약 제가 그 딜레마에 빠져 해결한다면, 저는 이 답변을 업데이트하려고 노력할 것입니다.Mongo Aggregate 쿼리를 실행하는 것보다 속도가 느리는지도 잘 모르겠습니다. 두 방법 간의 성능 비교를 실행해 본 적이 없습니다.

EDIT 2022-09-30: 사용자 지정 Pojo 목록을 반환하려면 spring-data-mongodb를 통한 집계 쿼리를 사용해야 할 것 같습니다.또한 기본 쿼리가 집계 쿼리보다 빠른 것 같으니 가능한 한 기본 쿼리를 사용하십시오.

@Query 주석을 사용하여 json 쿼리를 직접 전달할 수 있습니다. 예:

@Query("{ 'firstname' : 'john' }")

다음은 SpringData MongoDb - https://docs.spring.io/spring-data/mongodb/docs/current/reference/html/ #mongodb.deparities.json-based의 모든 json 기반 쿼리에 대한 링크입니다.

다음을 수행할 수 있습니다.

저장소에는 다음과 같은 방법이 있습니다.

String findPathByPath(String path);

문서가 아래와 같이 표시되고 경로만 반환하려는 경우

@Document(collection = "foo")
public class Foo  {

  String name;
  String path;
  String type;
  …
}

그런 다음 투영 인터페이스를 만듭니다(예:

@Projection(name = "flattenedFoo", types = Foo.class)
public interface FlattenedInvoice {
    String getPath(); // This returns the path value in Foo class
}

Getter 메서드를 사용하여 Foo에서 관심 있는 필드를 가져올 수 있습니다.

그런 다음 get 요청에서 projectionName을 지정해야 합니다. 예를 들어 (@Resource path)

@RestResource(path = "findByPath", rel = "findByPath")
String findPathByPath(String path);

그러면 다음과 같이 말할 수 있습니다(취득 요청에서).

...../FindByPath?path=target_path&projection=hosts

그러면 플랫푸 인터페이스에 지정된 필드만 포함된 json이 반환됩니다.

언급URL : https://stackoverflow.com/questions/32108953/how-to-return-only-specific-fields-for-a-query-in-spring-data-mongodb

반응형