MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Como processar solicitações de inserção no Spring Data antes de adicioná-las ao MongoDB?


Parece que é melhor escrever um controlador personalizado em vez de usar Spring Data REST aqui, pois basicamente você precisa de dois recursos:um para adicionar um link ou retornar um existente e um segundo para recuperar um URI original por meio de seu hash.

No primeiro método, você simplesmente chamaria um método de repositório findByLongURL(…) e use o URL obtido instância se você tiver um resultado ou der um segundo passo para realmente criar o hash e salvar o URL repositório de pensamento de instância. O segundo recurso basicamente chamaria seu método já existente.

Isso é direto e fácil de digerir.

Se você precisar que a implementação do método anterior seja uma operação atômica, o método de consulta do repositório precisa ser implementado manualmente (para obter instruções gerais sobre isso, leia a seção relevante no documentação de referência ):
class UrlRepositoryImpl implements UrlRepositoryCustom {

  private final MongoOperations operations;

  public UrlRepositoryImpl(MongoOperations operations) {
    this.operations = operations;
  }

  @Override
  public URL findOrInsert(String source) {

    // What to find?
    Query query = Query.query(Criteria.where("longURL").is(source);

    // What to write if nothing can be found
    Update update = new Update()
      .setOnInsert("longURL", source)
      .setOnInsert("hash", calculatedHash);

    FindAndModifyOptions options = new FindAndModifyOptions.options()
      .returnNew(true) // returns the document insert (if so)
      .upsert(true); // insert document if it doesn't exist

    return operations.findAndModify(query, update, options, URL.class);
  }
}

Como você pode ver, isso envolve lidar com alguns detalhes de nível inferior (embora a verbosidade possa ser reduzida usando importações estáticas), mas basicamente fornece uma operação atômica.