我有一个文档存储在Couchbase中。
{
"a": {
"b": {
"key":"Value"
},
"_class":"com.nikhil.model"
},
"c":{
"d":{
"key":"value"
},
// _class is missing here
},
"_class": "com.nikhil.model"
}
正如您所看到的,在此文件中的“ d”中没有_class,因此无法获取此文档。对象映射异常来了。 _class用于将沙发床的嵌套对象映射到映射所需的模型,但是在“ c”对象内部,我没有此_Class属性,这就是为什么出现映射异常的原因。 有什么解决办法吗?
答案 0 :(得分:2)
如果您使用的是Spring Boot,则需要在Couchbase Config文件中覆盖typekey()
方法,该文件扩展了AbstractCouchbaseConfiguration
并返回MappingCouchbaseConverter.TYPEKEY_SYNCGATEWAY_COMPATIBLE
。这将用存储在Couchbase Server中的文档中的javaClass
字符串替换您的_class。我希望这会有所帮助。
@Configuration
public class RemoteCouchbaseConfiguration extends AbstractCouchbaseConfiguration {
@Value("${couchbase.host}")
private String host;
@Value("${couchbase.bucket.bucketName}")
private String bucketName;
@Value("${couchbase.bucket.password}")
private String password;
@Override
protected List<String> getBootstrapHosts() {
return Arrays.asList(this.host);
}
@Override
protected String getBucketName() {
return this.bucketName;
}
@Override
protected String getBucketPassword() {
return this.password;
}
@Override
public String typeKey() {
return MappingCouchbaseConverter.TYPEKEY_SYNCGATEWAY_COMPATIBLE;
}
}
答案 1 :(得分:1)
就像您将Couchbase与Spring Data一起使用时,最简单的方法是返回投影:
@Override
public List<UserVO> getUsers(String companyId, List<String> userIds) {
String queryString = "SELECT meta(t).id as id, t.login as login, t.firstName as firstName from " + getBucketName() + " t where t."+getClassFilter()+" "
+ " and t.companyId = '" + companyId + "' and t.isEnabled = true and t.isVisible = true "
+ " and meta(t).id in ["+userIds.stream().map(e->"'"+e+"'").collect( Collectors.joining( "," )) +"]";
N1qlParams params = N1qlParams.build().consistency(ScanConsistency.NOT_BOUNDED).adhoc(true);
ParameterizedN1qlQuery query = N1qlQuery.parameterized(queryString, JsonObject.create(), params);
return userRepository.getCouchbaseOperations().findByN1QLProjection(query, UserVO.class);
}
答案 2 :(得分:0)
您可以使用UPDATE N1QL语句向其中添加_class:
UPDATE mybucket b
SET b.c.d._class = 'com.foo.bar'
WHERE b.c.d IS NOT MISSING
AND b.c.d._class IS MISSING
这将更新所有在'c'对象中具有'd'对象但在c对象中没有'_class'的文档。