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
의 재산.@Query
1로 설정된 필드만 반환됩니다.
@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
'programing' 카테고리의 다른 글
Oracle이 최근 1시간 내에 업데이트된 레코드 가져오기 (0) | 2023.06.25 |
---|---|
하위 그림의 공통 축 레이블 설정 방법 (0) | 2023.06.25 |
앱이 앱스토어에 없는 경우 Firebase Dynamic Links를 테스트하려면 어떻게 해야 합니까? (0) | 2023.06.25 |
VBA에서 셀 또는 범위만 재계산할 수 있습니까? (0) | 2023.06.25 |
UIScrollView가 스크롤되지 않음 (0) | 2023.06.25 |