2017-02-16 10 views
2

MongoTemplate을 사용하여 mongo 컬렉션에서 요소를 검색하는 쿼리를 작성하고 있습니다. 쿼리 조건에는 밑줄이있는 속성이 포함되어 있는데,이 속성은 '._'로 대체되어 쿼리에서 항상 0 요소를 반환합니다. 다음과 같이 로그를 찾고 밑줄 문자가있는 속성의 스프링 몽고 쿼리 컬렉션

Criteria matchingCriteria = Criteria 
.where("entries").elemMatch(Criteria.where("app_id").is(appId)) 

내가 생성 된 쿼리를 볼 수 있습니다

o.s.data.mongodb.core.MongoTemplate: find using query: { "entries" : { "$elemMatch" : { "app._id" : "5834718ab0"}}} fields: null for class: Ranking in collection: ranking 

이미와 밑줄 '\\'파괴력, BasicQuery으로 시도하고, 유니 코드 "응용 프로그램을 사용했습니다 \ u005Fid "라는 표현을 사용했는데 아무 것도 작동하지 않았습니다."app "라는 이름의 컬렉션이 데이터베이스에 존재한다는 점에 유의해야합니다.

동작이 표준으로 보이지 않습니다. 밑줄이있는 다른 속성을 사용하면 값이 대체되지 않습니다. :

Criteria matchingCriteria = Criteria .where("entries").elemMatch(Criteria.where("unique_app_id").‌​is(appId)) 

로그 :

o.s.data.mongodb.core.MongoTemplate find using query: { "entries" : { "$elemMatch" : { "unique_app_id" : "1131706359"}}} fields: null for class: class Ranking in collection: ranking 

항목은 다음 형식의 컬렉션 배열입니다 :

{ 
    "instanceId" : "654ba2d16579e", 
    "app_id" : "583471adb0", 
    "unique_app_id" : "554577506", 
    "value" : 169 
} 

그것은 (밑줄 교체없이) 같은 쿼리가에서 잘 작동하는지 언급 할 가치가 mongo IDE (이 경우에는 Robomongo).

저는 spring-boot-starter-data-mongodb 1.4.1.RELEASE를 사용하고 있습니다.

저는 현재 아이디어가 정말 부족합니다.

의견이 있으십니까? 이 Spring Data Commons 문서의 섹션 3.4.3 당

+1

[Spring-Data-Jpa Repository - 엔티티 열 이름의 밑줄]의 가능한 복제본 (http : // stackoverflow.com/questions/23456197/spring-data-jpa-repository-entity-column-name 밑줄) – Keith

+0

예제에'entries' 문서를 추가 할 수 있습니까? – Keith

+0

원래 질문에 추가 된 @Keith. – guanabara

답변

2

을 우리가 예약 문자로 밑줄 치료로

우리는 stongly 속성 이름하지만 낙타의 경우 (예 : 밑줄을 사용하지를 표준 자바 명명 규칙을 따라야 에 조언 대신).

스프링을 사용하여 요소 이름의 중간에 밑줄 문자를 사용할 수 있다고 생각하지 않습니다. 수동 참조는 참조 된 모음 뒤에 이름이 지정됩니다. 문서 형식 (컬렉션 이름은 단수)을 사용하고 그 뒤에 _id (<document>_id)을 사용하십시오. 이것은 중간에 밑줄을 사용할 수있는 유일한 경우입니다.

업데이트 : 여기 당신이보고있는 정확한 동작을위한 기존 pull request입니다뿐만 아니라 봄의 bug tracker 그것을 위해. 기준을 구문 분석 할 때 여러 _ 토큰을 발견하면 아마도 봄 API는 분할하지 않는, 그래서

> db.app.findOne({ "entries" : { "$elemMatch" : { "app_id" : "1"}}}) 
{ 
    "_id" : ObjectId("58a5bc6afa8dd4ae3097d5f7"), 
    "name" : "Keith", 
    "entries" : [ 
     { 
      "instanceId" : "654ba2d16579e", 
      "app_id" : "1" 
     } 
    ] 
} 

,하지만 를 수행하십시오 몽고 쉘에서

, 나는 성공을 다음 쿼리를 실행할 수 있습니다 하나를 구문 분석 할 때 탐색을 위해 분할합니다.

+0

원래 질문에 세부 정보를 추가했습니다. – guanabara

+0

흥미 롭습니다. mongo 쉘에서 쿼리를 실행하면 어떻게됩니까? – Keith

+0

나의 답변에 대한 최신 업데이트를 확인하십시오. app_id에서 app_id (두 개의 밑줄)로 문서를 업데이트하고'.elemMatch (Criteria.where ("app__id")')로 쿼리를 업데이트하면 Spring이 어떻게 반응하는지 보길 원할 것입니다. 참조 된 알려진 버그를 할인하십시오 - 나는 그것이 범인이라고 강력하게 의심합니다. – Keith