ArangoDB создать/обновить без нового

Я пытаюсь создать какие-то репозитории с arangodb rest api и притвориться весенним облаком.

Когда я выполняю Get, все в порядке, я получаю Entity как следует и даже могу сопоставить _key со своим свойством.

Моя проблема заключается в том, что когда я пытаюсь выполнить создание/обновление (Post/Patch), если я добавляю параметр запроса для returnNew, я получаю новый объект, но внутри new.

Например: http://localhost:8529/_db/testDB/_api/document/orderCollection?returnNew=true

{
  "_id": "orderCollection/ERGDEF34",
  "_key": "ERGDEF34",
  "_rev": "_UqhLPC----",
  "new": {
    "_key": "ERGDEF34",
    "_id": "orderCollection/ERGDEF34",
    "_rev": "_UqhLPC----",
    "description": "descriptionxpto",
    "amount": "5000000000000",
    "operation": {
      "id": "1",
      "description": "operation description",
      "status": "Completed"
    },
    "creationDate": [
      2017,
      3,
      13,
      15,
      23,
      1,
      546000000
    ]   
  }
}

Есть ли способ отправить новый объект вне свойства new?


person Miguel Guilherme    schedule 15.03.2017    source источник


Ответы (2)


Да, используя create API или update API возвращает свежесозданные документы в свойстве new. Такое поведение является способом документирования API, и он должен быть таким. Все существующие клиентские драйверы были реализованы поверх этой спецификации, поэтому нет простого способа изменить это (даже если бы мы захотели).

Основная причина использования свойства new заключается в том, что вы можете узнать, является ли документ новым или нет.

Однако ArangoDB предлагает микросервисы Foxx, так что вы можете легко создавать свои собственные API, которые работают так, как вы предпочитаете.

В общем, мы скорее управляем запросами функций через вопросы Github.

person dothebart    schedule 21.04.2017

** Редактировать: только что заметил, что вы используете Rest API. Если вы используете Java (как помечено), почему бы просто не использовать драйверы Java? Несмотря на это, вы все равно можете создать абстракцию для обработки варианта использования.

Вы должны обрабатывать это внутри своего уровня доступа к данным (вы абстрагировались, верно?)

Вот как я сейчас это делаю:

Интерфейс:

public interface DataAccess {

    public <T extends BaseEntity> T update(T entity, Class<T> c) throws DataException;

}

Реализация:

public class DataAccessImpl implements DataAccess {

    private ArangoDB arangoDB; 

    public DataAccessImpl(String database) {
        this.database = database;
        arangoDB = ArangoBuilderService.getInstance().getArangoDB();
    }

    public <T extends BaseEntity> T update(T entity, Class<T> c) throws DataException {
        try {
            String key = ((BaseEntity)entity).getKey();
            DocumentUpdateEntity<T> value = arangoDB.db(database).collection(c.getSimpleName().toLowerCase()).updateDocument(key, entity);
            return (T) value.getNew(); // TODO: better error handling
        } catch(ArangoDBException e){
            throw new DataException(e.getMessage(), e);
        }
    }

}

Использование:

DataAccess db = new DataAccessImpl(tenant);
User user = db.getByKey("userkey", User.class);
db.update(user, User.class);

Таким образом, вы абстрагируетесь от всех мелких деталей и просто используете POJO.

person Andrew Grothe    schedule 12.08.2017