2012-11-20 15 views
6

Pracowałem nad aplikacją Java, która używa MongoDB jako formy przechowywania, jednak mam problem. Gdy użytkownik doda komentarz w mojej aplikacji, dodaje dokument do kolekcji komentarzy, a następnie tworzy dane wyjściowe dla danych statystycznych. Jednak upsert dodaje tylko pierwszy raz (brak wywołań po aktualizacji lub wstawienie nowych danych). Oto odpowiedni kod:Java MongoTemplate: Upserts Not Generowanie 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); 
    } 
} 

Oto przykład wyników w moje komentarze kolekcji:

{ 
    "_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) 
} 

... i mój pojedynczy, samotny stat ...

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

Wskazówka brakujące "_id" i "_class" w kolekcji statystyk. Nie otrzymuję żadnych błędów w dziennikach mongo lub tomcat. Czy ktoś kiedykolwiek napotkał ten problem wcześniej lub wie, co to jest umowa? Dzięki za pomoc!

Uwaga: Jeśli usunąć upsert i dodaj stat Normalnie wszystko dodaje porządku (w tym, oczywiście, dodaje wiele statystyk dla jednego podmiotu, który nie jest pożądane)

+0

można dostarczyć wersję MongoDB jest uruchomiony przed i więcej informacji na temat zbierania statystyk? Możesz wydrukować podsumowanie kolekcji w powłoce Mongo, uruchamiając db.statistics.stats() - zastępując "statystyki" swoją nazwą kolekcji. –

+0

w jaki sposób wydałeś swój wpis z kolekcji statystyk? Nie jest możliwe, że zostałby wstawiony do MongoDB bez ObjectId() - tak to wygląda z Java POV przed upsertem? –

Odpowiedz

2

Chyba mogłabym spróbować opisać twoją klasę za pomocą @Document(collection = "colName") - Miałem ten sam problem dzisiaj. Upgrade działa czasem naprawdę dziwnie: nadal nie potrafię znaleźć sposobu na ciągłe uzyskiwanie błędu.

W rzeczywistości zrobiłem to obejście (tymczasowe, po prostu "zadziałaj"), gdzie musiałem sprawdzić obecność "_id" w obiekcie i jeśli jest zerowe, używam save, jeśli nie - I użyj aktualizacji. Tak, to dziwne, ale zadziałało.

0

Miałem problem polegający na tym, że instalowałem obiekt, który ma już id, więc _id został zachowany. Jednak klasa _ nie została zapisana. Moje obejście było dodać członka do mojej klasy w celu zapewnienia, że ​​dane _class jest zawsze:

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