Usar Cloud Firestore en modo Datastore

Firestore es una base de datos de documentos NoSQL creada a fin de proporcionar ajuste de escala automático, alto rendimiento y facilidad para el desarrollo de aplicaciones. Es la versión más reciente de Datastore y presenta varias mejoras con respecto a Datastore.

Debido a que Firestore en modo Datastore está optimizado para los casos de uso del servidor y para App Engine, recomendamos usar Firestore en modo Datastore para las bases de datos que las apps de App Engine usarán en gran medida. Firestore en modo nativo es más útil para casos de uso de notificaciones móviles y en tiempo real. Para obtener más información sobre los modos de Firestore, consulta Elige entre el modo nativo y el modo Datastore.

En este documento, se describe cómo usar la biblioteca cliente de Google Cloud para almacenar y recuperar datos en una base de datos en modo Datastore.

Requisitos previos y configuración

Sigue las instrucciones en “Hello, World!” para Java en App Engine a fin de configurar tu entorno y proyecto, y comprender cómo se estructuran las apps de Java en App Engine. Anota y guarda el ID del proyecto, ya que lo necesitarás para ejecutar la aplicación de muestra que se describe en este documento.

Clona el repositorio

Descarga (clona) la muestra:

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

Edita la configuración del proyecto y establece las dependencias

En pom.xml, establece las dependencias que te permitan usar el 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 de la aplicación

La aplicación de muestra registra, recupera y muestra las IP de los visitantes. Puedes ver que una entrada de registro es una clase simple de dos campos que recibe el tipo visit y se guarda en modo Datastore mediante el comando add() del almacén de datos. Luego, se recuperarán las últimas diez visitas en orden descendente con el comando run() del almacén de datos.

@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"));
    }
  }
}

Usa archivos index.yaml

La app de muestra realiza consultas sencillas. Las consultas más elaboradas del modo Datastore requieren uno o más índices, que debes especificar en un archivo index.yaml que tienes que subir junto con la app. Este archivo puede crearse de forma manual o generarse de forma automática mientras se prueba la app de forma local.

Pruebas locales

Si necesitas desarrollar y probar tu aplicación de forma local, puedes usar el emulador del modo Datastore.

Más información

Para obtener toda la información sobre el modo Datastore, incluidos los conceptos y las optimizaciones, consulta la documentación de Firestore en modo Datastore.