まくろぐ
更新:
作成:

Deno 用の MongoDB ドライバーとして、deno_mongo が公開されています。 Deno Deploy 上でも使えるので、Deno Deploy で公開する Web API から MongoDB Atlas に接続する、といったことが簡単に行えます。

MongoDB サーバーへ接続する

ローカルホスト上で起動した MongoDB サーバーへ接続するには次のようにします。

import { MongoClient } from "https://deno.land/x/mongo@v0.31.1/mod.ts";

const client = new MongoClient();
await client.connect("mongodb://127.0.0.1:27017");

// 後は client インスタンスを使って MongoDB を操作する

実運用を考えると、MONGO_URI のような環境変数で接続先の MongoDB サーバーを指定できるようにしておいた方がよいでしょう。 例えば、MongoDB Atlas サービスを使用している場合は、次のような接続文字列 (SRV URI) が発行されますが、ここには接続パスワードなどが含まれるので、この URI をハードコーディングすることはできません。

mongodb+srv://<user>:<password>@cluster-name.abcde.mongodb.net/?retryWrites=true&w=majority

次の client.ts モジュールは、MongoClient インスタンスを MONGO_URI 環境変数が示す MongoDB サーバーに接続し、export しています。 MONGO_URI 環境変数がセットされていない場合は、代わりに 127.0.0.1:27017 へ接続するようにしています。

client.ts
import { MongoClient } from "https://deno.land/x/mongo@v0.31.1/mod.ts";

const uri = Deno.env.get("MONGO_URI") ?? "mongodb://127.0.0.1:27017";
export const client = new MongoClient();
await client.connect(uri);

メインモジュールから次のようにインポートすることで、簡単に MongoClient インスタンスを使用できます。

main.ts
import { client } from "./client.ts";

// あとは client を使っていろいろな DB 操作
console.log(await client.listDatabases());

deno run でプログラムを実行するときは、--allow-env による環境変数へのアクセスと、--allow-net によるネットワークへのアクセスの許可が必要です。

$ deno run --allow-env --allow-net main.ts
[
  { name: "admin", sizeOnDisk: 40960, empty: false },
  { name: "config", sizeOnDisk: 61440, empty: false },
  { name: "local", sizeOnDisk: 40960, empty: false }
]

コレクションを参照する

MongoDB データベース内のコレクションを参照するときは、そこに含まれるドキュメントの型をあらかじめ定義しておくことができます。 次の例では、書籍データ(books コレクション)のスキーマ定義を行っています。

main.ts
import { ObjectId } from "https://deno.land/x/mongo@v0.31.1/mod.ts";
import { client } from "./client.ts";

// books コレクションのスキーマ定義(含まれるドキュメントの型)
interface BookSchema {
  _id: ObjectId;
  title: string;
  author: string;
}

// mydb データベースの books コレクションを参照する
const db = client.database("mydb");
const booksCollection = db.collection<BookSchema>("books");

このようにして Collection インスタンスを取得したら、あとは自由にドキュメントの追加や検索を行えます。

コレクション内のドキュメントを操作する

ドキュメントを追加する (insertOne, insertMany)

ドキュメントを追加するには、Collection クラスの insertOneinsertMany メソッドを使用します。

booksCollection.insertMany([
  { title: "Title-1", author: "Author-1" },
  { title: "Title-2", author: "Author-2" },
  { title: "Title-3", author: "Author-3" },
]);

ドキュメントを検索する (find, findOne)

ドキュメントを取得するには、Collection クラスの find メソッドや findOne メソッドを使用します。

すべてのドキュメントを取得
const books: BookSchema[] = await booksCollection.find({}).toArray();
title フィールドに特定の文字列が含まれているものを検索
const books: BookSchema[] = await booksCollection
  .find({ title: { $regex: "itle-3" } })
  .toArray();

その他のメソッドは、公式サイト を参考にしてください。

関連記事

まくろぐ
サイトマップまくへのメッセージ