2012-06-17 2 views
3

J'ai créé une collection 'sequence'. Il a des champs 'nom' et 'compteur'. Le champ 'name' est mis à 'Tag' et le champ 'counter' est mis à 0. Voici le code dans une méthode qui retourne la valeur suivante du champ 'counter'.Création/Mise à jour de séquences - MongoDB

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

Cependant, ce morceau de code ne fonctionne pas. Toutes les entrées?

J'ai trouvé une implémentation pour cela ici, http://dev.bubblemix.net/blog/2011/04/auto-increment-for-mongodb-with-the-java-driver/, cependant, je voulais savoir ce qui ne va pas avec ce morceau de code.

+0

Pouvez-vous augmenter le niveau de journal sur le serveur mongod (par exemple mongod -vvv) et vérifier ce qui est réellement envoyé au serveur lorsque ce code est exécuté? – jyemin

+0

J'ai exécuté le code du pilote java pur auquel vous avez lié et le voir dans les journaux exécutant mongod -v: Mer Jun 20 19:41:33 [conn3] exécuter la commande test. $ Cmd {findandmodify: "seq", query : {_id: "seq1"}, mise à jour: {$ inc: {seq: 1}}, nouvelle: true, upsert: true} Wed Jun 20 19:41:33 [conn3] requête test.seq requête: {_id : "seq1"} ntoreturn: 1 idhack: 1 reslen: 48 0ms Mer Jun 20 19:41:33 [conn3] update test.seq requête: {_id: "seq1"} mise à jour: {$ inc: {seq: 1 }} idhack: 1 0ms – jyemin

+0

Je n'ai pas vraiment compris de ces journaux ce qui se passe exactement. – devang

Répondre

4

Votre code fonctionne correctement à condition que vous ayez préalablement enregistré l'objet Sequence, avec le nom "Tag", dans MongoDB. Je vous suggère d'annoter le champ name avec l'annotation @Id. Ex .:

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; 
    } 

} 

Enregistrer l'objet dans MongoDB:

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