CouchBase中的_class属性

时间:2018-11-15 05:49:51

标签: couchbase spring-data-couchbase

我有一个文档存储在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属性,这就是为什么出现映射异常的原因。 有什么解决办法吗?

3 个答案:

答案 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'的文档。