Сохранение документа напрямую в виде значения id в Spring-data-Couchbase - PullRequest
1 голос
/ 16 апреля 2019

Я хочу сохранить объект JSON как документ в Couchbase.Идентификатор этого документа должен быть получен из этого объекта JSON, а значением должен быть сам этот объект JSON.Поскольку этот JSON слишком сложен, я не сопоставил его напрямую ни с одним классом POJO, но я создал Simple POJO, который имеет два поля, как показано ниже

@Document
public class SimplePojo{

    @Id
    private String id;

    @Field()
    private String complexJsonString;//the JSON string is stored in this variable
}

У меня также есть SimplePojoRepository, как показанониже

@Component
public interface SimplePojoRepository extends CouchbaseRepository<SimplePojo, String>{
}

Теперь я устанавливаю id и complexJsonString вручную перед вызовом метода сохранения: -

 SimplePojo myObj= new SimplePojo();
 myObj.setId(myKey);
 myObj.setComplexJsonString(jsonString);
 simplePojoRepository.save(myObj); 

Это работает нормально, но сохраняет документ в формате ниже

myKey: {
  complexJsonString : {//the original json Object here}
}

но я не хочу этого, я хочу сохранить его так: -

myKey : {//the original json Object here}

Итак, чтобы было понятно, Я не хочучтобы сохранить мой объект JSON как значение complexJsonString, а точнее, непосредственно как значение myKey. Может кто-нибудь подсказать мне, как этого добиться?

1 Ответ

2 голосов
/ 16 апреля 2019

Если вы хотите сохранить complexJsonString как вложенную сущность в вашем главном объекте, вам нужно преобразовать его в Pojo:

myObj.setSomeEntity(new SomeEntity())

Вы можете легко преобразовать свою JSON-кодированную строку в объект, используя ДжексонаObjectMapper:

ObjectMapper mapper = new ObjectMapper();
mapper.readValue( jsonString, SomeEntity.class);

Однако, если у вас нет контроля над структурой этого json, вам нужно будет использовать стандартный Java SDK вместо Spring Data One:

JsonObject obj = JsonObject.create().put(this.documentTypeName, this.documentValue)
                    .put("attrNam1", "attrValue1")
                    .put("attrNam2", "attrValue2")

JsonDocument doc = JsonDocument.create(session.getId(), maxExpirationTime, obj);
bucket.upsert(doc)

В приведенном выше случае вам нужно будет проанализировать вашу JSON-кодированную строку, используя некоторую библиотеку lib (например, gson / jackson), а затем преобразовать ее в JsonDocument на основе couchbase.

Наконец, вы также можете оставить свой коди используйте N1QL-функцию DECODE_JSON() всякий раз, когда вам нужно получить доступ к какому-либо свойству этой строки json.

ex:

SELECT
    i.itemName as itemName,
    SUM(i.quantity) AS totalQuantity
FROM sessionstore s
UNNEST DECODE_JSON(s.sessionCart).shoppingCart.items i
WHERE s.sessionCart IS NOT MISSING
GROUP BY i.itemName
ORDER BY SUM(i.quantity) DESC
LIMIT 10

...