Erlmongo is a pretty complete Erlang driver for mongodb.
All save/update/insert are safe and return if write succeeded.
It supports maps and proplists as datatypes. Strings can be lists or binaries, but strings received from mongodb (as a result of find) will be binaries.
Connections are pools (def. size 10) to master:
-
master/slave - read and write from master
-
master/master - pick a master at random and use it for everything
-
replica pairs/sets - find out which is master and connect to it
Always use an atom for naming pools. Name will be used for a public named ets table. Runtime connection API: mongodb:singleServer/1,2 mongodb:replicaPairs/3 mongodb:replicaSets/2 mongodb:masterSlave/3 mongodb:connect/1 mongodb:sharded/2
% List of servers does not have to be the entire list of the replica set. % Erlmongo will read the primary server from them and connect to it (even if not in the list). mongodb:replicaSets(mypool,["127.0.0.1:30000","127.0.0.1:30001"]). mongodb:connect(mypool).
make
erl
application:start(erlmongo).
% Set mongodb server info. singleServer(PoolName) is the same as singleServer(PoolName,10,"localhost:27017")
% NOTICE: Erlang 21 disabled tuple calls. You must call with mongoapi and last parameter Mong, e.g. mongoapi:count("user", Mong).
mongodb:singleServer(def).
mongodb:connect(def).
% Create an interface for test database (it has to be a binary)
Mong = mongoapi:new(def,<<"test">>).
% Save a new document
Mong:save("mycollection",#{name => "MyDocument", i => 10}).
% Return the document in map form
Mong:findOne("mycollection", #{i => 10}, map).
% With proplists
Mong:save("mydoc", [{"name", "MyDocument"}, {"i", 10}]).
% Return only _id and name field
Mong:findOne("mydoc", [{"i", 10}], [{"name", 1}]).
% Set Index. First parameter is so that the driver knows what collection
% we mean. If you have an already constructed record laying around use that.
% No need to construct a new record just so the driver can read the name.
% Second parameter the index we wish to create. 1 = ascending, -1 = descending.
Mong:ensureIndex("mycollection", [{#mydoc.i, 1}, {#mydoc.name, -1}])
% Find examples:
% Or
M:find("mycollection",[{'or',[{"a",1},{"i",11}]}],undefined,0,100).
% Parameters: Search criteria, field selector, docs to skip, docs to return
Mong:find("mycollection",#{i => 4}, #{name => 1}, 0, 10).
% Find with options
Mong:findOpt("mycollection", #{i => 4}, undefined, [explain], 0, 0).
% Embedded records
Mong:save("mycollection",#{name => "zembedom", i => 10, address = #{city => "ny", street => "some", country => "us"}}).
Mong:find("mycollection",#{address => #{city => "la"}}, undefined, 0, 0).
% Advanced queries (supported: gt, lt, gte, lte, ne, in, nin, all, size, exists):
% Documents with even i
Mong:find("mycollection",#{i => {mod, 2, 0}}, undefined, 0,0).
% Documents with i larger than 2:
Mong:find("mycollection", #{i => {gt, 2}}, undefined, 0,0).
% Documents with i between 2 and 5:
Mong:find("mycollection", #{i => {in, {gt, 2}, {lt, 5}}}, undefined, 0,0).
% in example:
Mong:find("mycollection", #{tags => {in, [2,3,4]}}, undefined, 0,0).
% exists example:
Mong:find("mycollection", #{tags => {exists, false}}, undefined, 0,0).
% findandmodify command
Mong:runCmd([{"findandmodify", "collectionname"},{"query", [{"fn","onmeta.flv"},{"ch","somechan"}]},{"remove",1}]).
% GridFS
% Always run this on collection before writing the first file
Mong:gfsIndexes().
{ok, Bin} = file:read_file("SomeFile").
% To open file for writing, use gfsNew
PID = Mong:gfsNew("myfile").
% You can set parameters: mime, meta (embedded document), aliases (array of names), chunk size (default 256k)
% flushLimit (at which buffer size data gets flushed to mongodb, def. 1MB)
% PID = Mong:gfsNew("myfile", [{chunkSize, 100}]).
% You can also set collection name (default is fd)
% PID = Mong:gfsNew("myfilecol", "myfile", []).
Mong:gfsWrite(PID,Bin).
Mong:gfsClose(PID).
% Reading
PID = Mong:gfsOpen(#gfs_file{filename = "myfile"}).
Res = Mong:gfsRead(PID,100000).
Mong:gfsClose(PID).
Look at bson:encode_element/1
You can use application environment variables or use set_ssl to establish connections over ssl before you connect with mongodb:connect.
mongodb:set_ssl(true). % for ssl options use mongodb:set_ssl(true, SslOpts).
Mochijson library has a different string/list encoding convention: string = binary array = list You can choose a preferred way to encode with mongoapi:set_encode_style/1. Selected style is set to a selected server and table and not for mongoapi module instance. An example:
...
12> Mong:set_encode_style(default).
ok
13> Mong:save("foobar", [{<<"data">>, [[1.1, 2.2], [3.3, 4.4]]}]).
** exception error: bad argument
in function unicode:characters_to_binary/1
called as unicode:characters_to_binary([[1.1,2.2],[3.3,4.4]])
in call from mongodb:encode_cstring/1
in call from mongodb:encode_element/1
in call from mongodb:'-encode/2-fun-0-'/3
in call from lists:foldl/3
in call from mongodb:encode/2
in call from mongoapi:save/3
14> Mong:set_encode_style(mochijson).
ok
15> Mong:save("foobar", [{<<"data">>, [[1.1, 2.2], [3.3, 4.4]]}]).
{oid,<<"000af08b902dee723e000006">>}
Collections
-
remove
-
save
-
insert
-
update
-
batchInsert
-
ensureIndex
-
deleteIndex
-
deleteIndexes
-
count
-
dropCollection
-
createCollection
-
group
Search
-
find
-
findopt
-
cursor - getMore - closeCursor
-
findOne
DB
-
eval
-
stats
-
runCmd
-
repairDatabase
-
cloneDatabase
-
dropDatabase
-
addUser
-
setProfilingLevel
-
getProfilingLevel
GridFS
-
gdsIndexes
-
gfsNew
-
gfsWrite
-
gfsOpen
-
gfsRead
-
gfsDelete
-
gfsFlush
-
gfsClose
Sergej Jurečko
