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
-
We insert the document and get a result the ID:
{:ok, %Mongo.InsertOneResult{acknowledged: true, inserted_id: #BSON.ObjectId<5d526a8f306a5f10851a0134>}}
-
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"}
-
We update the postal code:
{:ok, %Mongo.UpdateResult{acknowledged: true, matched_count: 1, modified_count: 1, upserted_ids: []}}
-
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"}
-
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