zookzook

zookzook

Elixir and MongoDB

If you want to use the MongoDB in your next Killer-App-Project, but you did not dare ask because otherwise many would advise you to use Postgres, then you are right here. I won’t talk about choosing the right database. I will show how to use the MongoDB with Elixir. I assume that you already know the MongoDB and can use the Mongo Shell.

The first starting point are the official documentation pages of the driver. You can choose between two drivers:

I will add some more examples. But for now I published two simple crud examples to get an idea how to use the MongoDB driver. It is very simple.

In the example we just create, read, update and delete the following document:

def create_vcard() do
	%{
		firstname: "Alexander",
		lastname: "Abendroth",
		contact: %{
			email: "alexander.abendroth@campany.de",
			telephone: "+49 111938947373",
			mobile: "+49 222192938383",
			fax: "+49 3332929292"
		},
		addess: %{
			street: "Fasanenweg 5",
			postal_code: "12345",
			city: "Berlin",
			country: "de"
		}
	}
end

And here is our first CRUD example:

def example_1() do

	{:ok, top} = Mongo.start_link(url: "mongodb://localhost:27017/db-1")
	
	result = Mongo.insert_one(top, "people", create_vcard())

	IO.puts "#{inspect result}\n"

	result = Mongo.find_one(top, "people", %{})
	IO.puts "#{inspect result}\n"

	result = Mongo.update_one(top, "people", %{lastname: "Abendroth"}, ["$set": ["address.postal_code": "20000"]])
	IO.puts "#{inspect result}\n"

	result = Mongo.find_one(top, "people", %{"contact.email": "alexander.abendroth@campany.de"})
	IO.puts "#{inspect result}\n"

	result = Mongo.delete_one(top, "people", %{lastname: "Abendroth"})
	IO.puts "#{inspect result}\n"

end

We create a connection to the MongoDB-Instance listening von port 27001 and use the db-1

  1. We insert the document and get a result the ID: {:ok, %Mongo.InsertOneResult{acknowledged: true, inserted_id: #BSON.ObjectId<5d526a8f306a5f10851a0134>}}

  2. We are searching for the first document and got the inserted document back: %{"_id" => #BSON.ObjectId<5d526a8f306a5f10851a0134>, "addess" => %{"city" => "Berlin", "country" => "de", "postal_code" => "12345", "street" => "Fasanenweg 5"}, "contact" => %{"email" => "alexander.abendroth@campany.de", "fax" => "+49 3332929292", "mobile" => "+49 222192938383", "telephone" => "+49 111938947373"}, "firstname" => "Alexander", "lastname" => "Abendroth"}

  3. We update the postal code: {:ok, %Mongo.UpdateResult{acknowledged: true, matched_count: 1, modified_count: 1, upserted_ids: []}}

  4. We search again but search for the email: %{"_id" => #BSON.ObjectId<5d526a8f306a5f10851a0134>, "addess" => %{"city" => "Berlin", "country" => "de", "postal_code" => "12345", "street" => "Fasanenweg 5"}, "address" => %{"postal_code" => "20000"}, "contact" => %{"email" => "alexander.abendroth@campany.de", "fax" => "+49 3332929292", "mobile" => "+49 222192938383", "telephone" => "+49 111938947373"}, "firstname" => "Alexander", "lastname" => "Abendroth"}

  5. We delete the document: {:ok, %Mongo.DeleteResult{acknowledged: true, deleted_count: 1}}

The mongodb driver has the following features:

  • Supports MongoDB versions 3.2, 3.4, 3.6, 4.0
  • Connection pooling (through DBConnection 2.x)
  • Streaming cursors
  • Aggregation pipeline
  • Replica sets
  • Support for SCRAM-SHA-256 (MongoDB 4.x)
  • Support for change streams api (See)
  • Support for bulk writes (See)

I will try to add some more examples which show a special feature or how to the driver for some interesting use cases. But be patient I do this in my free time :slight_smile:

Most Liked

hauleth

hauleth

Any reason why this is better than existing drivers like this one? I mean that this is great project, but what was lacking in others and why not expand existing drivers instead of creating new one?

zookzook

zookzook

Look here:

hauleth

hauleth

And mongodb? You have said you have forked that one, but there is no rationale why you needed to fork at all.

Last Post!

rodmclaughlin

rodmclaughlin

I figured out how to make MongoDB work with Elixir/Phoenix. A simple example can be found here: GitHub - pdxrod/simple_mongo_app · GitHub.

Where Next?

Popular in Guides/Tuts Top

smpallen99
Did you know that IO.inspect/2 returns the the first argument and accepts a label option as a second argument. This makes it a perfect to...
New
niku
I write an article Parameterized testing with ExUnit.The key concept is using ExUnit.Case.register_test/4 such as ExUnit.start() defmod...
New
nietaki
Just a quick heads up: There seems to be a bug in Erlang/OTP 21.3, which can cause some errors when making http requests. If you’re using...
New
mudasobwa
The post covering how to generate nifty types to use in @spec in compile time with macros.
New
eclark
I’ve been working on a phoenix project lately and I wanted to use the latest versions of everything. Webpack 5 had some breaking changes ...
New
GenericJam
Just leaving some breadcrumbs for future me and future others like me. Connect with TCP (not secured) - most servers will reject but use...
New
water
I’ll post this here, It might help someone in the future. Feedback is greatly appreciated. I use it with direnv on NixOS, It should wor...
New

Other popular topics Top

JeremM34
Hello, how can I check the Phoenix version ? Thanks !
New
hariharasudhan94
Lets say I have map like this fetching from my database %{"_id" =&gt; #BSON.ObjectId&lt;58eb1a7a9ad169198c3dXXXX&gt;, "email" =&gt; ...
New
Darmani72
If I have a post route which an argument: post /my_post_route/:my_param1, MyController.my_post_handler How would get the post params ...
New
axelson
This post is a wiki (feel free to hit the edit button near the bottom right of this post to add your own changes!) This post collects co...
239 49134 226
New
siddhant3030
Hi, I have to write a raw query for one of my project. But till now I have used ecto queries and don’t have much experience writing raw ...
New
WestKeys
Currently suffering from paralysis by [HTTP client] analysis. This is rather unusual in Elixirland as there tends to be consensus on the ...
New

We're in Beta

About us Mission Statement