ArangoDB en un proyecto real

ArangoDB es una base de datos híbrida (documentos y gráficos). Sus aspectos positivos incluyen:







  • potente y conveniente lenguaje de consulta AQL
  • JOIN (incluso más poderoso que las bases de datos relacionales)
  • replicación y fragmentación
  • ACID (funciona en el clúster solo en la versión paga)


Funciones menos esenciales, pero no menos convenientes:







  • Búsqueda borrosa
  • Motor de microservicios Foxx integrado en la base de datos
  • trabajar en el modo de suscripción para cambios en la base de datos


Para ser justos, también señalaré las desventajas:







  • sin ODM
  • baja popularidad (en comparación con MongoDB, por ejemplo)


Tras analizar las capacidades de ArangoDB y, sobre todo, tras superar las carencias en las últimas versiones (como una fuerte caída del rendimiento cuando se supera el tamaño de la colección de RAM disponible) y la aparición de nuevas funcionalidades (como la búsqueda difusa) , es hora de probarlo en una aplicación real.







Capacidades de AQL (ArangoDB Query Language)



Una de las principales preguntas que me preocupaba era si la expresividad de AQL sería suficiente para ejecutar la gama completa de consultas en una aplicación real. Y funcionará sin ORM / ODM será lo suficientemente cómodo.







Hay varias formas en ArangoDB de consultar datos. Existe una API orientada a objetos familiar para quienes trabajan con MongoDB, pero este método se considera obsoleto en ArangoDB y el énfasis principal está en las consultas AQL.







La consulta más simple para una colección se ve así:







db.query({
  query: `for doc in managers
    filter doc.role == @role
    sort doc.@field @order
    limit @page * @perPage, @perPage
    return doc`,
  bindVars: { role, page, perPage, field, order },
});
      
      





, FOR, , , , role .







, . mongoose (MongoDB) populate(). ArangoDB AQL:







db.query({
   query: `
      for mall in malls
        for city in cities
          filter mall.cityId == city._key
      return merge(mall, { city })
  `,
  bindVars: { },
});
      
      





INNER JOIN. , city , , SQL.







LEFT JOIN — LET:







db.query({
  query: `
    for city in cities
      let malls=(
        for mall in malls
          filter mall.cityId==city._key
          return mall
      )
    return merge(city, {malls})`,
  bindVars: { },
});
      
      





malls array null. , LEFT JOIN SQL — , city, mall. mall . , . "" , SQL, , .







, . , , , , , SQL. - NoSQL , .









- ArangoDB . : _from _to. , . .







- . , update . . , .









: , . , Elacticsearch. . -, Elasticsearch. , , . , -, Elasticsearch , .







ArangoDB SEARCH VIEW :







  await db.createAnalyzer('fuzzy_brand_search_bigram', {
    type: 'ngram',
    properties: { min: 2, max: 2, preserveOriginal: true },
    features: ['position', 'frequency', 'norm'],
  });
  await db.createView('brandSearch', {
    links: {
      brands: {
        includeAllFields: true,
        analyzers: ['fuzzy_brand_search_bigram'],
      },
    },
  });
      
      





:







db.query({
    query: `
       for brand in brandSearch
          search NGRAM_MATCH(
              brand.name, 
              @brandName, 
              0.4, 
              'fuzzy_brand_search_bigram'
          )
          filter brand.mallId == @mallId
        return brand `,
    bindVars: { mallId, brandName },
});
      
      





ODM?



, , MongoDB ODM. , .







, , , AQL, . , Sequelize (ORM ), - RAW .







, , , ODM. , ODM ArangoDB. ODM . , ODM , . , , , .







, , . . - PATCH , , , . . , -, . issue . , , . , . .







En mi artículo, describí e implementé mi biblioteca. Lo usé en un proyecto real. Por supuesto, hubo momentos de estrés cuando resultó que las capacidades de esta biblioteca no eran suficientes. Pero en su mayoría se resolvieron. Así que todavía invito a la cooperación a aquellos que deseen promover la tecnología ArangoDB.







apapacy@gmail.com

15 de marzo de 2021








All Articles