2012-06-17 4 views
3

'시퀀스'컬렉션을 만들었습니다. '이름'과 '카운터'필드가 있습니다. 'name'필드는 'Tag'로 설정되고 'counter'필드는 0으로 설정됩니다. 다음은 'counter'필드의 다음 값을 반환하는 메소드 내의 코드입니다.시퀀스 생성/업데이트 - MongoDB

final Sequence tagSequence = mongoTemplate.findAndModify(
    new Query(Criteria.where("name").is("Tag")), 
    new Update().inc("counter", 1), 
    new FindAndModifyOptions().returnNew(true), Sequence.class); 

그러나이 코드는 작동하지 않습니다. 어떤 입력?

여기 구현 된 코드는 http://dev.bubblemix.net/blog/2011/04/auto-increment-for-mongodb-with-the-java-driver/입니다. 그러나이 코드의 문제점을 알고 싶었습니다.

+0

당신이 mongod 서버의 로그 레벨 (예 : mongod -vvv)을 증가시킬 수 있습니다 때이 코드를 실제로 서버로 전송되고 있는지 확인 실행됩니까? – jyemin

+0

mongod -v를 실행하는 로그에서 링크 된 순수 java 드라이버 코드를 실행했습니다. Wed Jun 20 19:41:33 [conn3] 명령 테스트를 실행합니다. $ cmd {findandmodify : "seq", query : {_id : "seq1"}, 업데이트 : {$ inc : {seq : 1}}, 새 : true, upsert : true} Wed Jun 20 19:41:33 [conn3] 쿼리 test.seq 쿼리 : {_id : "seq1"} ntoreturn : 1 idhack : 1 reslen : 48 0ms Wed Jun 20 19:41:33 [test3] update test.seq 검색어 : {_id : "seq1"} 업데이트 : {$ inc : {seq : 1 }} idhack : 1 0ms – jyemin

+0

정확히 어떤 일이 벌어지고 있는지이 로그에서 이해하지 못했습니다. – devang

답변

4

코드는 MongoDB에서 "태그"이름으로 Sequence 개체를 처음 저장 한 경우 올바르게 작동합니다. @Id 주석을 사용하여 name 필드에 주석을 달 것을 제안합니다. 예 :

public class Sequence { 
    @Id 
    protected final String name; 
    protected Long counter; 

    public Sequence(String name, Long counter) { 
     this.name = name; 
     this.counter = counter; 
    } 
    public String getName() { 
     return name; 
    } 
    public Long getCounter() { 
     return counter; 
    } 
    public void setCounter(Long counter) { 
     this.counter = counter; 
    } 

} 

저장하여 MongoDB에서 오브젝트 :

template.save(new Sequence("Tag",0L))