我的项目中有一个自定义键类,如下所示。
我已经实现了Serializable,实现了hashCode并且等于。
public class SalesKey implements Serializable {
Date timestamp;
String hostName;
public Date getTimestamp() {
return timestamp;
}
public void setTimestamp(Date timestamp) {
this.timestamp=timestamp;
}
public void setHostName(String hostName) {
this.hostName=hostName;
}
public String getHostName() {
return hostName;
}
@Override
public int hashCode() {
..
}
@Override
public boolean equals(Object obj) {
...
}
}
我在MongoDB Document类中使用自定义键类,如下所示。
@Document(collection = "Sales")
public class Sales {
@Id
SalesKey salesKey;
//Other fields
}
我可以使用spring data mongodb将文档保存到mongodb中。
Sales sales=new Sales();
SalesKey salesKey=getSalesKey();
sales.setSalesKey(salesKey)
//set other fields for sales object
//Save sales Document object to mongodb
保存成功。
我也可以使用扩展MongoRepository的SalesRepository接口中的以下查询来获取。 构建之后,salesKey和以前一样。
@Query(value = "{ '_id' : ?0 }")
public Sales filterBySalesKey(SalesKey salesKey);
当我尝试使用下面的条件API进行更新时,用于更新文档中的特定字段。
我首先使用下面的标准。
Criteria salesKeyCriteria = Criteria.where("_id").is(salesKey);
根据上述标准,我然后执行更新陈述
但是,我的更新因错误而失败,
org.bson.codecs.configuration.CodecConfigurationException:无法找到com.demo.model.SalesKey类的编解码器
我正在使用Spring Data MongoDB框架和MongoDB 3.2.1。
任何人都可以帮助我什么是编解码器,如何添加一个以使我的更新成功。
答案 0 :(得分:0)
由于SalesKey
是您的Mongo _id
,您可以使用MongoTemplate执行以下操作:
@Autowired
private MongoTemplate mongoTemplate;
...
Query query = new Query(Criteria.where("_id").is(salesKey));
mongoTemplate.updateFirst(query,Update.update("field", "new-value"),Sales.class);
跟进您对mongo解释的评论
如果我在mongo shell中查看更新说明:
$ db.sales.explain().update({"_id" : { "timestamp" : ISODate("2016-08-25T12:12:59.251Z"), "hostName" : "myhostname" }},{value:"new-value"})
它向我展示了使用IDHACK的获胜计划:
"winningPlan" : {
"stage" : "UPDATE",
"inputStage" : {
"stage" : "IDHACK"
}
},
销售凭证示例:
{ "_id" : { "timestamp" : ISODate("2016-08-25T12:12:59.251Z"), "hostName" : "value" }, "value" : "new" }