2013-05-09 26 views
9

Bu [2] yöntemini kullanarak bir belgeyi yükseltmeye (arttırma veya ekleme) çalışırken zaman zaman [2] alıyorum.Mongodb upsert atma DuplicateKeyException

[1]

public NGram save(final NGram ngram) { 
    Criteria cr = where("_id").is(ngram.getNgram()) 
      .and("f3c").is(ngram.getF3c()) 
      .and("tokCount").is(ngram.getTokCount()) 
      .and("first").is(ngram.getFirst()) 
      ; 
    if(ngram.getTokCount() > 1) { 
     cr.and("second").is(ngram.getSecond()); 
    } 
    if(ngram.getTokCount() > 2) { 
     cr.and("third").is(ngram.getThird()); 
    } 
    final Query qry = new Query(cr); 
    final Update updt = new Update().inc("count", ngram.getCount()); 
    template.upsert(qry, updt, NGram.class); 
    return ngram; 
} 

[2]

Caused by: org.springframework.dao.DuplicateKeyException: E11000 duplicate key error index: sytrue.ngram.$_id_ dup key: { : "page two" }; nested exception is com.mongodb.MongoException$DuplicateKey: E11000 duplicate key error index: sytrue.ngram.$_id_ dup key: { : "page two" } 
at org.springframework.data.mongodb.core.MongoExceptionTranslator.translateExceptionIfPossible(MongoExceptionTranslator.java:52) 
at org.springframework.data.mongodb.core.MongoTemplate.potentiallyConvertRuntimeException(MongoTemplate.java:1665) 
at org.springframework.data.mongodb.core.MongoTemplate.execute(MongoTemplate.java:390) 
at org.springframework.data.mongodb.core.MongoTemplate.doUpdate(MongoTemplate.java:920) 
at org.springframework.data.mongodb.core.MongoTemplate.upsert(MongoTemplate.java:894) 
at com.sytrue.ngram.repo.impl.NGramRepositoryImpl.save(NGramRepositoryImpl.java:43) 
at sun.reflect.GeneratedMethodAccessor41.invoke(Unknown Source) 

Upsert bana bu durum asla geri gerekir. Ben haklı mıyım Sadece şu olabilir tahmin ediyorum

+0

örneklerini aynı anda iki ihtimal göz önünde bulundurun. –

+0

Hayır, bu sıraları bir sıraya göre sıralıyorum. – biliboc

cevap

16

sorunu:

Birçok kriterlere dayalı bulmak işlemlerini yapıyoruz. Bu, eğer bir parametrenin herhangi bir uyuşmazlığı nedeniyle (kriterler halinde) başarısız olursa, belgeyi yerleştirmeye çalışacaktır demektir.

Yani, aynı belgeyi aynı _id ile güncellemeye çalıştığınız, ancak diğer ölçütlerin bazılarının eşleşmediği ve yinelenen anahtar özel durumuna neden olan yeniden eklenmesini sağladığınız olasılıklar vardır. Aşağıdaki örnekte

test:Mongo > db.example.update({ _id : 1, a : 1, b : 1},{ $set : {d : 1}}, true, false) 
test:Mongo > db.example.find() 
{ "_id" : 1, "a" : 1, "b" : 1, "d" : 1 } 
test:Mongo > db.example.update({ _id : 1, a : 1, b : 2},{ $set : {d : 1}}, true, false) 
E11000 duplicate key error index: test.example.$_id_ dup key: { : 1.0 }