Como usar o Cloud Firestore no modo Datastore

O Firestore é um banco de dados de documentos NoSQL criado para fornecer escalonamento automático, alto desempenho e facilidade no desenvolvimento de aplicativos. O Firestore é a mais nova versão do Datastore e apresenta várias melhorias em relação a ele.

Como o Firestore no modo Datastore é otimizado para casos de uso do servidor e para o App Engine, recomendamos o uso do Firestore no modo Datastore para bancos de dados que serão usados principalmente por aplicativos do App Engine. O Firestore no modo nativo é mais útil para casos de uso de notificações móveis e em tempo real. Para mais informações sobre os modos do Firestore, consulte Como escolher entre o modo nativo e o modo Datastore.

Neste documento, descrevemos como usar a biblioteca de cliente do Google Cloud para armazenar e recuperar dados em um banco de dados no modo Datastore.

Pré-requisitos e configuração

Siga as instruções em "Hello, World!" para Java no App Engine para configurar o ambiente e o projeto, além de entender como os aplicativos do Java são estruturados no App Engine. Anote e salve o ID do projeto. Você precisará dele para executar o aplicativo de amostra descrito neste documento.

Clonar o repositório

Faça o download ou clone da amostra:

git clone https://github.com/GoogleCloudPlatform/java-docs-samples
cd java-docs-samples/flexible/datastore

Editar a configuração do projeto e definir as dependências

Em pom.xml, defina dependências que permitam usar o modo Datastore:

<!--  Using libraries-bom to manage versions.
See https://github.com/GoogleCloudPlatform/cloud-opensource-java/wiki/The-Google-Cloud-Platform-Libraries-BOM -->
<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>com.google.cloud</groupId>
      <artifactId>libraries-bom</artifactId>
      <version>25.0.0</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
  </dependencies>
</dependencyManagement>

<dependencies>
  <dependency>
    <groupId>com.google.cloud</groupId>
    <artifactId>google-cloud-datastore</artifactId>
  </dependency>
</dependencies>

Código do aplicativo

O aplicativo de amostra registra, recupera e exibe IPs de visitantes. É possível observar que a entrada de registro é uma classe simples de dois campos que recebe o tipo visit e é salva no modo Datastore por meio do comando add() do armazenamento de dados. Em seguida, as 10 visitas mais recentes são recuperadas em ordem decrescente por meio do comando run() do armazenamento de dados.

@SuppressWarnings("serial")
@WebServlet(name = "datastore", value = "")
public class DatastoreServlet extends HttpServlet {

  @Override
  public void doGet(HttpServletRequest req, HttpServletResponse resp)
      throws IOException, ServletException {
    // store only the first two octets of a users ip address
    String userIp = req.getRemoteAddr();
    InetAddress address = InetAddress.getByName(userIp);
    if (address instanceof Inet6Address) {
      // nest indexOf calls to find the second occurrence of a character in a string
      // an alternative is to use Apache Commons Lang: StringUtils.ordinalIndexOf()
      userIp = userIp.substring(0, userIp.indexOf(":", userIp.indexOf(":") + 1)) + ":*:*:*:*:*:*";
    } else if (address instanceof Inet4Address) {
      userIp = userIp.substring(0, userIp.indexOf(".", userIp.indexOf(".") + 1)) + ".*.*";
    }

    Datastore datastore = DatastoreOptions.getDefaultInstance().getService();
    KeyFactory keyFactory = datastore.newKeyFactory().setKind("visit");
    IncompleteKey key = keyFactory.setKind("visit").newKey();

    // Record a visit to the datastore, storing the IP and timestamp.
    FullEntity<IncompleteKey> curVisit =
        FullEntity.newBuilder(key).set("user_ip", userIp).set("timestamp", Timestamp.now()).build();
    datastore.add(curVisit);

    // Retrieve the last 10 visits from the datastore, ordered by timestamp.
    Query<Entity> query =
        Query.newEntityQueryBuilder()
            .setKind("visit")
            .setOrderBy(StructuredQuery.OrderBy.desc("timestamp"))
            .setLimit(10)
            .build();
    QueryResults<Entity> results = datastore.run(query);

    resp.setContentType("text/plain");
    PrintWriter out = resp.getWriter();
    out.print("Last 10 visits:\n");
    while (results.hasNext()) {
      Entity entity = results.next();
      out.format(
          "Time: %s Addr: %s\n", entity.getTimestamp("timestamp"), entity.getString("user_ip"));
    }
  }
}

Como usar arquivos index.yaml

O app de exemplo faz consultas simples. Consultas mais elaboradas do modo Datastore exigem um ou mais índices, que você precisa especificar em um arquivo index.yaml enviado com o aplicativo. Esse arquivo pode ser criado ou gerado automaticamente ao testar seu aplicativo localmente.

Teste local

Se precisar desenvolver e testar seu aplicativo localmente, é possível usar o emulador de modo Datastore.

Para saber mais

Para informações completas sobre o modo Datastore, incluindo otimizações e conceitos, veja a documentação do Cloud Firestore no modo Datastore.