【问题标题】:DuplicateKeyException: error code 11000 and error message 'E11000'DuplicateKeyException:错误代码 11000 和错误消息“E11000”
【发布时间】:2018-02-02 21:30:08
【问题描述】:

我只想使用 id 字段更新/替换文档,我正在使用 mongoTemplate.save(p, collection) 方法,但我收到 DuplicateKeyException: 错误代码 11000 和错误消息“E11000”

public class MongoDAO {
	
	@Autowired
	@Qualifier("mongoTemplate")
	private MongoTemplate mongoTemplate;
	
	private static final String PERSON_COLLECTION = "person";

	public MongoTemplate getMongoTemplate() {
		return mongoTemplate;
	}
	
  public void update(Object p) {
		this.mongoTemplate.save(p, PERSON_COLLECTION);
	}
  
 } 

这是我的 DAO

    public class PersonDAO{
      @Autowired
    	MongoDAO mongoDAO;

      public void updatePerson(){
      
         //read
    		Person p1 = mongoDAO.readById("1234");
    		
    		//update
    		p1.setName("David");
        mongoDAO.update(p1);
    		
     }
}

Person.java 类

package com.mongo.andy;

import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Field;

public class Person {
	
	@Id
	private String id;
	@Field
	private String name;
	
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	
	

}

我只是想从 mongodb 获取对象更改值并根据 _id 更新文档 使用 mongooperation.save() 或 mongotemplate.save() 我得到以下错误

com.mongodb.DuplicateKeyException: Write failed with error code 11000 and error message 'E11000 duplicate key error collection: Person.person index: _id_ dup key: { : "5996f1d43b6af5c797a1cf4g" }'
	at com.mongodb.operation.BaseWriteOperation.convertBulkWriteException(BaseWriteOperation.java:236)
	at com.mongodb.operation.BaseWriteOperation.access$300(BaseWriteOperation.java:60)
	at com.mongodb.operation.BaseWriteOperation$1.call(BaseWriteOperation.java:146)
	at com.mongodb.operation.BaseWriteOperation$1.call(BaseWriteOperation.java:133)
	at com.mongodb.operation.OperationHelper.withConnectionSource(OperationHelper.java:230)
	at com.mongodb.operation.OperationHelper.withConnection(OperationHelper.java:221)
	at com.mongodb.operation.BaseWriteOperation.execute(BaseWriteOperation.java:133)
	at com.mongodb.operation.BaseWriteOperation.execute(BaseWriteOperation.java:60)
	at com.mongodb.Mongo.execute(Mongo.java:781)
	at com.mongodb.Mongo$2.execute(Mongo.java:764)
	at com.mongodb.DBCollection.executeWriteOperation(DBCollection.java:333)
	at com.mongodb.DBCollection.insert(DBCollection.java:328)
	at com.mongodb.DBCollection.insert(DBCollection.java:319)
	at com.mongodb.DBCollection.insert(DBCollection.java:289)
	at com.mongodb.DBCollection.insert(DBCollection.java:255)
	at com.mongodb.DBCollection.insert(DBCollection.java:192)
	at org.springframework.data.mongodb.core.MongoTemplate$9.doInCollection(MongoTemplate.java:1051)
	at org.springframework.data.mongodb.core.MongoTemplate.execute(MongoTemplate.java:479)
	at org.springframework.data.mongodb.core.MongoTemplate.insertDBObject(MongoTemplate.java:1046)
	at org.springframework.data.mongodb.core.MongoTemplate.doInsert(MongoTemplate.java:855)
	at org.springframework.data.mongodb.core.MongoTemplate.doSaveVersioned(MongoTemplate.java:1001)
	at org.springframework.data.mongodb.core.MongoTemplate.save(MongoTemplate.java:985)
	at com.mcmcg.dia.account.metadata.dao.MongoDAO.update(MongoDAO.java:105)
	at com.mcmcg.dia.account.metadata.service.AccountOALDService.mongotestapi(AccountOALDService.java:265)
	at com.mcmcg.dia.account.metadata.service.AccountOALDService$$FastClassBySpringCGLIB$$7f85f843.invoke(<generated>)

请提供解决方案并建议是否有其他方法可以仅基于 id 字段使用 spring-data 更新/替换 mongodb 中的文档。我有大型自定义对象,编写任何更新查询并不有趣。 我可以使用 upsert() 在 couchbase db 中这样做,在 mongodb 中找到了类似的方法。

【问题讨论】:

  • 您能否将您的个人代码 sn-p 也添加到此问题中?

标签: java mongodb spring-data-mongodb mongotemplate


【解决方案1】:

代替this.mongoTemplate.save(p, PERSON_COLLECTION); 试试:

public void update(Object p) {
  BasicDBObject dbObject = new BasicDBObject();
  mongoTemplate.getConverter().write(p, dbObject);
  mongoTemplate.upsert(new Query(Criteria.where("_id").is(((Person) p).getId())), 
      Update.fromDBObject(dbObject, "_id"), PERSON_COLLECTION);
}

解决方案类似于upsert方法在MongoTemplate中的实现方式。

【讨论】:

    猜你喜欢
    • 2018-02-22
    • 2017-01-03
    • 1970-01-01
    • 2013-08-04
    • 2011-07-10
    • 1970-01-01
    • 2017-05-25
    • 2018-11-27
    相关资源
    最近更新 更多