😽

DenoでArangoDBにアクセスしてみた(Tnifey/arango)

2021/11/15に公開

darangoを使ったサンプルはこちら
https://zenn.dev/rururu3/articles/b9ece3c6f8adbd

DenoでArangoDBにアクセス

Denoのハンズオンに参加してみてDeno触ってみるついでにArangoDBにアクセスできるか試しました

Tnifey/arangoがあった

ぐぐったらあったので使ってみた
https://github.com/Tnifey/arango

サンプル

Tnifey.ts

import {
  aql,
  Database,
} from "https://github.com/Tnifey/arango/raw/main/mod.ts";

// ArangoDBに接続する
const db = new Database({
  url: "http://localhost:8529/", // ArangoDBの場所を指定
  auth: { username: "ユーザーID", password: "パスワード" }, // 認証用のUserIDとPasswordを指定
  name: "_system", // データベース名を指定
});

// Alternative:
// const pool = arango({
//   url: "http://localhost:8529/",
//   auth: { username: "root" },
// });
// const db = pool.database('_system');

// aqlでデータ作って取得する
async function sample1() {
  // forでデータを5件返すAQL
  const payload = 5;
  const query = aql` 
    let nums = ${payload}
    for i in 1..nums // [1,2,3,4,5]
      return i + 1
  `;
  
  try {
    // AQLを流す(バッチサイズ2なので2件づつとってくる)
    const cursor = await db.query(query, { batchSize: 2 });
    // バッチサイズが2なので2件取得される
    console.log({
      cursor: await cursor.all(),
    });
    // 次のデータを取得
    let more = await cursor.nextBatch();
    // データが取れなくなるまで
    while(more) {
      // 出力
      console.log({
        more: await more?.all(),
      });
      // 次のデータを取得
      more = await cursor.nextBatch();
    }
  }
  catch (error) {
    console.log(error);
  }
}

// Collectionから取得する
async function sample2() {
  // Charactersからデータを取得するAQL
  const query = aql`
  for u in Characters
    return u
  `;
  try {
    // AQLを流す(バッチサイズ5なので5件づつとってくる)
    const cursor = await db.query(query, { batchSize: 5 });
    // バッチサイズが5なので5件取得される
    console.log({
      cursor: await cursor.all(),
    });
  } catch(error) {
    console.log(error);
  }
}

await sample1();
await sample2();

結果

deno run --allow-net Tnifey.ts
Check file:///E:/DockerProject/arangodb/denosample/main.ts
{ cursor: [ 2, 3 ] }
{ more: [ 4, 5 ] }
{ more: [ 6 ] }
{
  cursor: [
    {
      _key: "112602",
      _id: "Characters/112602",
      _rev: "_dBBNWXq---",
      name: "Ned",
      surname: "Stark",
      alive: true,
      age: 41,
      traits: [ "A", "H", "C", "N", "P" ]
    },
    {
      _key: "112603",
      _id: "Characters/112603",
      _rev: "_dBBNWXq--_",
      name: "Robert",
      surname: "Baratheon",
      alive: false,
      traits: [ "A", "H", "C" ]
    },
    {
      _key: "112604",
      _id: "Characters/112604",
      _rev: "_dBBNWXq--A",
      name: "Jaime",
      surname: "Lannister",
      alive: true,
      age: 36,
      traits: [ "A", "F", "B" ]
    },
    {
      _key: "112605",
      _id: "Characters/112605",
      _rev: "_dBBNWXq--B",
      name: "Catelyn",
      surname: "Stark",
      alive: false,
      age: 40,
      traits: [ "D", "H", "C" ]
    },
    {
      _key: "112606",
      _id: "Characters/112606",
      _rev: "_dBBNWXq--C",
      name: "Cersei",
      surname: "Lannister",
      alive: true,
      age: 36,
      traits: [ "H", "E", "F" ]
    }
  ]
}

Discussion