実際のプロジェクトでのArangoDB

ArangoDBは、ハイブリッド(ドキュメントとグラフ)データベースです。その肯定的な側面は次のとおりです。







  • 強力で便利なクエリ言語AQL
  • JOIN(リレーショナルデータベースよりもさらに強力)
  • レプリケーションとシャーディング
  • ACID(有料バージョンでのみクラスターで機能します)


それほど重要ではありませんが、それほど便利な機能ではありません。







  • あいまい検索
  • データベースに組み込まれたFoxxマイクロサービスエンジン
  • データベースの変更については、サブスクリプションモードで作業してください


公平を期すために、私は欠点にも注意します。







  • ODMなし
  • 人気が低い(たとえば、MongoDBと比較して)


ArangoDBの機能を分析した後、特に最新バージョンの欠点(使用可能なRAMのコレクションのサイズを超えた場合のパフォーマンスの急激な低下など)と新機能の出現(あいまい検索など)を克服した後、実際のアプリケーションでテストする時が来ました。







AQL(ArangoDBクエリ言語)機能



私が心配した主な質問の1つは、AQLの表現力が実際のアプリケーションですべての範囲のクエリを実行するのに十分であるかどうかでした。そして、ORM / ODMがなくても十分快適に動作します。







ArangoDBには、データをクエリする方法がいくつかあります。MongoDBを使用するユーザーにはおなじみのオブジェクト指向APIがありますが、このメソッドはArangoDBでは廃止されたと見なされており、主にAQLクエリに重点が置かれています。







1つのコレクションに対する最も単純なクエリは次のようになります。







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 . , , . , . .







私の記事では、ライブラリについて説明し、実装しました。実際のプロジェクトで使用しました。もちろん、このライブラリの機能が十分でないことが判明したとき、ストレスの瞬間がありました。しかし、それらはほとんど解決されました。ですから、ArangoDB技術を推進したい方には、ぜひご協力をお願いします。







apapacy@gmail.com2021年

3月15日








All Articles