目的: ElixirからMongoDBのドライバを使ってみる。
実施環境:
OS: Windows8.1
Erlang: Eshell V6.4
Elixir: v1.0.4
elixir-mongo: v0.5.1
MongoDB:v3.0.3
目次:
- 概要
- "mix new"でプロジェクト作成
- Elixirのライブラリを取り込んでみよう!!
- MongoDBに接続するだけの簡単なお仕事!!
1.概要
1.1
今回の記事は少し趣向を変えます。
と言いますか、ずっと英語を素人翻訳するのがあきてきたので、
次の活力を得るためにElixir+MongoDBをやってみようかと思います。
この方の記事を参考に実施しました。
Qiita - Elixirで試しに何か書いてみる(その1)
しかし、CRUD操作まで辿り着けなかった・・・orz
1.2
環境はあらかじめ構築しておいて下さい。
すまないが、これだけなんだ・・・
4.2
追記(2015/06/04-21:25)
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"}]
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
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)
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のソースコードは以下の通り作成した。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
mongo = Mongo.connect! | |
db = mongo |> Mongo.db("phoenix_bbs") | |
collection = db |> Mongo.Db.collection("comments") | |
Mongo.Server.close(mongo) |
すまないが、これだけなんだ・・・
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
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操作ができました。
修正したソースコードは以下の通りになります。
実行結果
追記(2015/06/04-21:20)
CRUD操作ができました。
修正したソースコードは以下の通りになります。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) |
実行結果
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操作できたー!!