свойство _class в CouchBase

У меня есть документ, хранящийся в Couchbase.

{
  "a": {
    "b": {
      "key":"Value"
    },
 "_class":"com.nikhil.model"
  },
    "c":{
      "d":{
        "key":"value"
       },
  // _class is missing here
     },
      "_class": "com.nikhil.model"
 }

Здесь, как вы можете видеть, у меня нет _class внутри «d» в документе, из-за этого я не могу получить этот документ. Возникло исключение сопоставления объектов. _class используется для сопоставления вложенного объекта диванной базы с моделью, необходимой для сопоставления, но внутри объекта «c» у меня нет этого свойства _Class, поэтому возникает исключение сопоставления. Есть ли какое-нибудь решение для этого?


person Nikhil    schedule 15.11.2018    source источник
comment
Этот json недействителен (даже при удалении комментария), вы можете обновить его для точности (проверьте jsonlint.com, если вам нужна помощь)   -  person Matthew Groves    schedule 15.11.2018


Ответы (3)


Если вы используете загрузку Spring, вам необходимо переопределить метод typekey() в файле конфигурации Couchbase, который расширяет AbstractCouchbaseConfiguration и возвращает MappingCouchbaseConverter.TYPEKEY_SYNCGATEWAY_COMPATIBLE. Это заменит ваш _class строкой javaClass в документах, хранящихся на сервере Couchbase. Надеюсь, это поможет.

@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;
    }
}
person awasum    schedule 15.01.2019

Похоже, вы используете 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);
}
person deniswsrosa    schedule 15.11.2018
comment
Разве мы не можем сделать это, используя репозиторий Spring, например, используя JPA? - person Nikhil; 16.11.2018

Вы можете добавить к нему _class, используя инструкцию UPDATE N1QL следующим образом:

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

Это обновит любой документ, который имеет объект «d» в объекте «c», но не имеет «_class» в объекте c.

person Matthew Groves    schedule 15.11.2018