2012-11-20 2 views
6

J'ai travaillé sur une application Java qui utilise MongoDB comme forme de stockage, mais j'ai rencontré un problème. Lorsqu'un utilisateur ajoute un commentaire dans mon application, il ajoute le document à la collection de commentaires, puis effectue une reprise pour les données statistiques. Cependant, l'upsert ajoute seulement la première fois (pas d'appels après la mise à jour ou insérer de nouvelles données). Voici le code correspondant:Java MongoTemplate: Upserts non générant ObjectId

public class CommentDAO implements ICommentDAO { 

    @Autowired 
    @Qualifier(value = "mongoDB") 
    MongoTemplate mongoTemplate; 

    public UserComment addComment(UserComment userComment) { 
     updateStats(userComment, 1L); 
     mongoTemplate.save(userComment); 
     return userComment; 
    } 

    public void updateStats(UserComment userComment, Long offset) { 
     Update update = new Update(); 
     update.inc("total", offset); 
     Query query = query(where("entity").is(userComment.getEntity())); 

     WriteResult wr = mongoTemplate.upsert(query, update, CommentStat.class); 
    } 
} 

Voici un exemple des résultats dans ma collection de commentaires:

{ 
    "_id" : ObjectId("50ab0566e4b0ea8f74b82d48"), 
    "_class" : "com.test.models.comment.UserComment", 
    "userId" : 4, 
    "ownerId" : 3, 
    "comment" : "Test comment", 
    "type" : "ART", 
    "entity" : "759446489112216656", 
    "date" : Date(1353385318079) 
}, 
{ 
    "_id" : ObjectId("50ab0691e4b0775cf7daacad"), 
    "_class" : "com.test.models.comment.UserComment", 
    "userId" : 4, 
    "ownerId" : 3, 
    "comment" : "Another test", 
    "type" : "ART", 
    "entity" : "759446489112216656", 
    "date" : Date(1353385617619) 
} 

... et ma stat unique, solitaire ...

{ 
    "entity" : "759446489112216656", 
    "total" : 1 
} 

Avis le "_id" et "_class" manquants sur la collection de statistiques. Je ne reçois aucune erreur dans mes journaux mongo ou tomcat. Est-ce que quelqu'un a déjà rencontré ce problème avant ou sait ce que c'est? Merci de votre aide!

Note: Si je supprime le upsert et ajouter la stat normalement, tout ajoute bien (cela, bien sûr, ajoute plusieurs statistiques pour une seule entité, qui est pas souhaitable)

+0

Pouvez-vous fournir la version de MongoDB vous exécutez contre et plus d'informations sur la collecte des statistiques? Vous pouvez imprimer un résumé de collection sur le shell mongo en exécutant db.statistics.stats() - en remplaçant "statistics" par le nom de votre collection. –

+0

Comment avez-vous sorti votre entrée de la collection de statistiques? Il n'est pas possible qu'il soit inséré dans MongoDB sans ObjectId() - est-ce que c'est ce que ça ressemble de Java POV avant l'upsert? –

Répondre

2

Je pense que vous pourrait essayer d'annoter votre classe avec le @Document(collection = "colName") - J'ai eu le même problème aujourd'hui. Les Upserts fonctionnent parfois bizarrement: je n'arrive toujours pas à trouver le moyen d'obtenir le bug de manière cohérente.

En fait ce que j'ai fait est créé une solution de contournement (temporaire, juste "faire fonctionner"), où j'ai dû vérifier la présence de "_id" dans l'objet et si elle est nulle, j'utilise save, sinon utiliser la mise à jour. Oui, c'est bizarre, mais ça a marché.

0

J'ai rencontré un problème lorsque je souhaitais mettre à jour un objet qui avait déjà un ID, donc le _id était préservé. Cependant, la classe n'a pas été enregistrée. Ma solution a été d'ajouter un membre à ma classe pour faire en sorte que les données de _class est toujours là:

@Field("_class") 
protected String _class = Foo.class.getName(); 
Questions connexes