2012-11-20 37 views
6

MongoDB'yi depolama biçimi olarak kullanan bir java uygulaması üzerinde çalışıyorum, ancak bir sorunla karşılaşıyorum. Bir kullanıcı benim uygulamamda bir yorum eklediğinde, dokümanı yorum koleksiyonuna ekler, ardından istatistiksel veriler için bir artış yapar. Ancak, destek ilk kez sadece ilk kez eklenir (güncellemeden sonra arama yapılmaz veya yeni veri eklenir). İşteJava MongoTemplate: Upserts ObjectId Oluşturmuyor

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

açıklamalarım koleksiyonunda sonuçlarının bir örneği var:

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

... ve benim tek ve yalnız istatistik ...

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

Bildirim İlgili kod İşte stat koleksiyonundaki "_id" ve "_class" eksik. Mongo veya tomcat günlüklerimde hiç hata alamıyorum. Daha önce bu problemle karşılaşan biri var mı, yoksa anlaşmanın ne olduğunu biliyor mu? Yardım ettiğin için teşekkür ederim!

Not: Ben Upsert kaldırmak ve normal bir stat eklerseniz, her şey

+0

Eğer karşı ve istatistikler koleksiyonu hakkında daha fazla bilgi çalıştıran MongoDB sürümünü verebilir: My geçici çözüm _class verilerin her zaman orada olduğundan emin olmak için dersime bir üye eklemek için oldu? Koleksiyon isminizle "istatistikler" yerine "db.statistics.stats() - koşarak mongo kabuğunda bir koleksiyon özeti yazdırabilirsiniz. –

+0

Girişinizi stat koleksiyonundan nasıl çıktı? Bir ObjectId() olmadan MongoDB içine yerleştirilmiş olması mümkün değil - bu yüzden upsert önce Java POV dan göründüğü nedir? –

cevap

2

Bence sen (bu tabii ki arzu değil tek bir varlık için birden istatistikleri ekler) ince ekler @Document(collection = "colName") ile sınıfınıza not eklemeye çalışabilirim - bugün aynı sorunu yaşadım. Upserts bazen çok garip çalışır: Ben hala hatayı sürekli olarak elde etmenin yolunu bulamıyorum.

Aslında yaptığım, geçici bir çözüm (geçici, yalnızca "işe yara") oluşturuldu, burada nesnede "_id" varlığı olup olmadığını kontrol etmem gerekiyordu ve eğer boşsa, kaydet, kullanmam ama - güncellemeyi kullan. Evet, garip ama işe yaradı.

0

Zaten bir kimliği olan bir nesneyi zorladığım bir sorun yaşadım, bu nedenle _id korunmuştur. Ancak, _class kaydedilmedi.

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