使用Spring Data MongoDB使用复合_id字段查找和更新文档

时间:2016-08-25 10:53:26

标签: mongodb spring-data-mongodb bson

我的项目中有一个自定义键类,如下所示。

我已经实现了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。

任何人都可以帮助我什么是编解码器,如何添加一个以使我的更新成功。

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" }