スポンサーリンク

2015年6月4日

[Elixir+MongoDB]MongoDBに接続するだけの簡単なお仕事!!

タイトル: [Elixir+MongoDB]MongoDBに接続するだけの簡単なお仕事!!

目的: ElixirからMongoDBのドライバを使ってみる。

実施環境:
OS: Windows8.1
Erlang: Eshell V6.4
Elixir: v1.0.4
elixir-mongo: v0.5.1
MongoDB:v3.0.3

目次:

  1. 概要
  2. "mix new"でプロジェクト作成
  3. Elixirのライブラリを取り込んでみよう!!
  4. MongoDBに接続するだけの簡単なお仕事!!

1.概要

1.1
今回の記事は少し趣向を変えます。
と言いますか、ずっと英語を素人翻訳するのがあきてきたので、
次の活力を得るためにElixir+MongoDBをやってみようかと思います。

この方の記事を参考に実施しました。
Qiita - Elixirで試しに何か書いてみる(その1)

しかし、CRUD操作まで辿り着けなかった・・・orz

1.2
環境はあらかじめ構築しておいて下さい。

  • MongoDBのインストール
  • Elixirのインストール

また、MongoDBは起動しておいて下さい。
参考までに・・・

2."mix new"でプロジェクト作成

2.1
コマンドプロンプトを開く。

作業ディレクトリを作成するので、
適切なディレクトリに移動しておくこと。

2.2
以下のコマンド実行する。
コマンド: mix new mongo_test

作業ディレクトリ名はお好きなものをどうぞ!!

ディレクトリが作成されているか確認する。
lsでもいいしGUIで見てもいいです。

これで、mix newを使ってプロジェクトができました。

2.3
作成したディレクトリへ移動し、以下のコマンドを実行する
コマンド: mix test

何もエラーが出なければおk。

3.Elixirのライブラリを取り込んでみよう!!

3.1
作業ディレクトリに移動する。

その中から、"/mongo_test/mix.exs"を開く。

3.2
色々書かれていると思うが、とりあえず目的だけ達する。

何がしたいか・・・
MongoDBのElixirドライバのライブラリが欲しい!!

下の方に"defp deps do"と言う部分がある。
ここに、以下の行を追加する。
追加: [{:mongo, "~> 0.5.1"}]

defmodule MongoTest.Mixfile do
use Mix.Project
def project do
[app: :mongo_test,
version: "0.0.1",
elixir: "~> 1.0.4",
build_embedded: Mix.env == :prod,
start_permanent: Mix.env == :prod,
deps: deps]
end
# Configuration for the OTP application
#
# Type `mix help compile.app` for more information
def application do
[applications: [:logger]]
end
# Dependencies can be Hex packages:
#
# {:mydep, "~> 0.3.0"}
#
# Or git/path repositories:
#
# {:mydep, git: "https://github.com/elixir-lang/mydep.git", tag: "0.1.0"}
#
# Type `mix help deps` for more examples and options
defp deps do
[{:mongo, "~> 0.5.1"}]
end
end
view raw mix.exs hosted with ❤ by GitHub

3.3
以下のコマンドを実行する。
コマンド: mix deps.get

これで、3.2で設定したライブラリがダウンロードできる。
依存関係とかも考慮しないといけないらしいが、
今回使うライブラリは一つだけなので気にしない。

hexの利用を聞かれると思うがyesで・・・
local.hexと各プロジェクトで混在できるらしい。

参考までにコマンドの実行結果
mongo_test>mix deps.get
Could not find hex, which is needed to build dependency :mongo
Shall I install hex? [Yn] y
* creating c:/Users/Takes_000/.mix/archives/hex.ez
Running dependency resolution
Dependency resolution completed successfully
  mongo: v0.5.1
  bson: v0.4.3
* Getting mongo (Hex package)
Checking package (https://s3.amazonaws.com/s3.hex.pm/tarballs/mongo-0.5.1.tar)
Fetched package
Unpacked package tarball (c:/Users/Takes_000/.hex/packages/mongo-0.5.1.tar)
* Getting bson (Hex package)
Checking package (https://s3.amazonaws.com/s3.hex.pm/tarballs/bson-0.4.3.tar)
Fetched package
Unpacked package tarball (c:/Users/Takes_000/.hex/packages/bson-0.4.3.tar)

4.MongoDBに接続するだけの簡単なお仕事!!

4.1
Elixirのソースコードは以下の通り作成した。
mongo = Mongo.connect!
db = mongo |> Mongo.db("phoenix_bbs")
collection = db |> Mongo.Db.collection("comments")
Mongo.Server.close(mongo)
view raw mongo_test.ex hosted with ❤ by GitHub


すまないが、これだけなんだ・・・

4.2
mixで実行するため以下のコマンドを使う。
コマンド: mix run ./lib/mongo_test.ex

4.3
MongoDBに接続し、DBとコレクションが作成されたか確認してみる。
(接続時、DB、コレクションがない場合は作成されて接続される)

以下、一連のMongoDB操作の流れ
mongo_test>mongo
MongoDB shell version: 3.0.3
connecting to: test
> db
test
> show databases
local        0.078GB
phoenix_bbs  0.078GB
> use phoenix_bbs
switched to db phoenix_bbs
> show collections
comments
system.indexes
>exit

問題なく作成されている。
CRUD操作は何れにせよやらなくてはいけないので、
また分かったら続きの記事を作成する。

追記(2015/06/04-21:20)
CRUD操作ができました。

修正したソースコードは以下の通りになります。
mongo = Mongo.connect!
db = mongo |> Mongo.db("phoenix_bbs")
collection = db |> Mongo.Db.collection("comments")
# init data
Mongo.Collection.drop collection
[
%{name: "hoge", title: "hoge", comment: "hogehoge"},
%{name: "huge", title: "huge", comment: "hugehuge"},
%{name: "darui", title: "blogger", comment: "darui"}
] |> Mongo.Collection.insert(collection)
IO.puts "insert result"
%{name: "foo", title: "bar", comment: "foobar"} |> Mongo.Collection.insert_one!(collection)
# find
docs = collection |> Mongo.Collection.find |> Enum.to_list
IO.inspect docs
IO.puts ""
IO.puts "update result"
collection |> Mongo.Collection.update(%{name: "foo"}, %{name: "fizz", title: "bazz", comment: "fizzbazz"})
# find
docs = collection |> Mongo.Collection.find |> Enum.to_list
IO.inspect docs
IO.puts ""
IO.puts "delete result"
collection |> Mongo.Collection.delete(%{name: "fizz"})
# find
docs = collection |> Mongo.Collection.find |> Enum.to_list
IO.inspect docs
Mongo.Server.close(mongo)
view raw mongo_test02.ex hosted with ❤ by GitHub


実行結果
insert result
[%{_id: ObjectId(55703854f328cfab505c6d99), comment: "hogehoge", name: "hoge",
   title: "hoge"},
 %{_id: ObjectId(55703854f328cfab505c6d9a), comment: "hugehuge", name: "huge",
   title: "huge"},
 %{_id: ObjectId(55703854f328cfab505c6d9b), comment: "darui", name: "darui",
   title: "blogger"},
 %{_id: ObjectId(55703854f328cfab505c6d9c), comment: "foobar", name: "foo",
   title: "bar"}]

update result
[%{_id: ObjectId(55703854f328cfab505c6d99), comment: "hogehoge", name: "hoge",
   title: "hoge"},
 %{_id: ObjectId(55703854f328cfab505c6d9a), comment: "hugehuge", name: "huge",
   title: "huge"},
 %{_id: ObjectId(55703854f328cfab505c6d9b), comment: "darui", name: "darui",
   title: "blogger"},
 %{_id: ObjectId(55703854f328cfab505c6d9c), comment: "fizzbazz", name: "fizz",
   title: "bazz"}]

delete result
[%{_id: ObjectId(55703854f328cfab505c6d99), comment: "hogehoge", name: "hoge",
   title: "hoge"},
 %{_id: ObjectId(55703854f328cfab505c6d9a), comment: "hugehuge", name: "huge",
   title: "huge"},
 %{_id: ObjectId(55703854f328cfab505c6d9b), comment: "darui", name: "darui",
   title: "blogger"}]

以上!!

以下、参考にさせて頂いたサイト様

管理人の独り言~
MongoDBに接続できるのにCRUD操作ができない・・・orz

Elixirの記法とかさっぱりやってないのがいけない。
Phoenixばかりではなく、Elixir自体も少しやらないと・・・

追記(2015/06/04-21:25)
CRUD操作できたー!!


人気の投稿