Packages
gleam_mongo
0.2.0
0.18.1
retired
0.18.0
retired
0.17.0
retired
0.16.0
retired
0.15.1
retired
0.15.0
retired
0.14.0
retired
0.13.0
retired
0.12.0
retired
0.11.0
retired
0.10.0
retired
0.9.0
retired
0.8.0
retired
0.7.0
retired
0.6.0
retired
0.5.0
retired
0.4.0
retired
0.3.0
0.2.0
retired
0.1.3
retired
0.1.2
retired
0.1.1
retired
0.1.0
retired
A mongodb driver for gleam
Retired package: Renamed - Republished as mungo
Current section
Files
Jump to
Current section
Files
src/mongo@crud.erl
-module(mongo@crud).
-compile(no_auto_import).
-export([insert_one/2, find_by_id/2, find_one/3, insert_many/2, find_all/2, find_many/3, update_one/4, update_many/4, delete_one/2, delete_many/2, count_all/1, count/2]).
-export_type([update_result/0]).
-type update_result() :: {update_result, integer(), integer()} |
{upsert_result, integer(), bson@object_id:object_id()}.
-spec insert_one(mongo@client:collection(), bson@types:value()) -> {ok,
integer()} |
{error, mongo@utils:mongo_error()}.
insert_one(Collection, Doc) ->
_pipe = Collection,
insert_many(_pipe, [Doc]).
-spec find_by_id(mongo@client:collection(), binary()) -> {ok,
bson@types:value()} |
{error, mongo@utils:mongo_error()}.
find_by_id(Collection, Id) ->
case bson@object_id:from_string(Id) of
{ok, Id@1} ->
_pipe = Collection,
find_one(
_pipe,
{document, [{<<"_id"/utf8>>, {object_id, Id@1}}]},
{document, []}
);
{error, nil} ->
{error, {mongo_error, -16, <<""/utf8>>, null}}
end.
-spec find_one(
mongo@client:collection(),
bson@types:value(),
bson@types:value()
) -> {ok, bson@types:value()} | {error, mongo@utils:mongo_error()}.
find_one(Collection, Filter, Projection) ->
case Filter of
{document, _@1} ->
case Projection of
{document, Doc} ->
Options = case Doc of
[] ->
[{limit, 1}];
_@2 ->
[{limit, 1}, {projection, Projection}]
end,
case begin
_pipe = Collection,
find_many(_pipe, Filter, Options)
end of
{ok, []} ->
{ok, null};
{ok, [Doc@1]} ->
{ok, Doc@1};
{error, Error} ->
{error, Error}
end;
_@3 ->
{error, {mongo_error, -16, <<""/utf8>>, null}}
end;
_@4 ->
{error, {mongo_error, -16, <<""/utf8>>, null}}
end.
-spec insert_many(mongo@client:collection(), list(bson@types:value())) -> {ok,
integer()} |
{error, mongo@utils:mongo_error()}.
insert_many(Collection, Docs) ->
case begin
_pipe = Docs,
gleam@list:all(_pipe, fun(Doc) -> case Doc of
{document, _@1} ->
true;
_@2 ->
false
end end)
end of
true ->
case begin
_pipe@1 = Collection,
mongo@client:execute(
_pipe@1,
{document,
[{<<"insert"/utf8>>, {str, erlang:element(3, Collection)}},
{<<"documents"/utf8>>, {array, Docs}}]}
)
end of
{ok, [{<<"n"/utf8>>, {integer, N}}, {<<"ok"/utf8>>, Ok}]} ->
case Ok of
{double, 1.0} ->
{ok, N};
_@3 ->
{error, {mongo_error, -16, <<""/utf8>>, null}}
end;
{ok,
[{<<"n"/utf8>>, _@4},
{<<"writeErrors"/utf8>>, {array, Errors}},
{<<"ok"/utf8>>, Ok@1}]} ->
case Ok@1 of
{double, 1.0} ->
{ok, Error@1} = case gleam@list:first(Errors) of
{ok, Error} -> {ok, Error};
_try ->
erlang:error(#{gleam_error => assert,
message => <<"Assertion pattern match failed"/utf8>>,
value => _try,
module => <<"mongo/crud"/utf8>>,
function => <<"insert_many"/utf8>>,
line => 76})
end,
case Error@1 of
{document,
[{<<"index"/utf8>>, _@5},
{<<"code"/utf8>>, {integer, Code}},
{<<"keyPattern"/utf8>>, _@6},
{<<"keyValue"/utf8>>, Source},
{<<"errmsg"/utf8>>, {str, Msg}}]} ->
{error, {mongo_error, Code, Msg, Source}};
_@7 ->
{error,
{mongo_error, -16, <<""/utf8>>, null}}
end;
_@8 ->
{error, {mongo_error, -16, <<""/utf8>>, null}}
end;
{error, {Code@1, Msg@1}} ->
{error, {mongo_error, Code@1, Msg@1, null}}
end;
false ->
{error, {mongo_error, -16, <<""/utf8>>, null}}
end.
-spec find_all(mongo@client:collection(), list(mongo@utils:find_option())) -> {ok,
list(bson@types:value())} |
{error, mongo@utils:mongo_error()}.
find_all(Collection, Options) ->
Body = [{<<"find"/utf8>>, {str, erlang:element(3, Collection)}}],
Options@1 = begin
_pipe = Options,
gleam@list:fold(_pipe, [], fun(Acc, Opt) -> case Opt of
{sort, {document, Sort}} ->
[{<<"sort"/utf8>>, {document, Sort}} | Acc];
{projection, {document, Projection}} ->
[{<<"projection"/utf8>>, {document, Projection}} | Acc];
{skip, Skip} ->
[{<<"skip"/utf8>>, {integer, Skip}} | Acc];
{limit, Limit} ->
[{<<"limit"/utf8>>, {integer, Limit}} | Acc]
end end)
end,
Body@1 = gleam@list:append(Options@1, Body),
case begin
_pipe@1 = Collection,
mongo@client:execute(_pipe@1, {document, Body@1})
end of
{ok, Result} ->
[{<<"cursor"/utf8>>, {document, Result@1}}, {<<"ok"/utf8>>, Ok}] = Result,
[{<<"firstBatch"/utf8>>, {array, Docs}},
{<<"id"/utf8>>, _@1},
{<<"ns"/utf8>>, _@2}] = Result@1,
case Ok of
{double, 1.0} ->
{ok, Docs};
_@3 ->
{error, {mongo_error, -16, <<""/utf8>>, null}}
end;
{error, {Code, Msg}} ->
{error, {mongo_error, Code, Msg, null}}
end.
-spec find_many(
mongo@client:collection(),
bson@types:value(),
list(mongo@utils:find_option())
) -> {ok, list(bson@types:value())} | {error, mongo@utils:mongo_error()}.
find_many(Collection, Filter, Options) ->
case Filter of
{document, _@1} ->
Body = [{<<"find"/utf8>>, {str, erlang:element(3, Collection)}},
{<<"filter"/utf8>>, Filter},
{<<"batchSize"/utf8>>, {integer, 2}}],
Options@1 = begin
_pipe = Options,
gleam@list:fold(_pipe, [], fun(Acc, Opt) -> case Opt of
{sort, {document, Sort}} ->
[{<<"sort"/utf8>>, {document, Sort}} | Acc];
{projection, {document, Projection}} ->
[{<<"projection"/utf8>>, {document, Projection}} |
Acc];
{skip, Skip} ->
[{<<"skip"/utf8>>, {integer, Skip}} | Acc];
{limit, Limit} ->
[{<<"limit"/utf8>>, {integer, Limit}} | Acc]
end end)
end,
Body@1 = gleam@list:append(Body, Options@1),
case begin
_pipe@1 = Collection,
mongo@client:execute(_pipe@1, {document, Body@1})
end of
{ok, Result} ->
[{<<"cursor"/utf8>>, {document, Result@1}},
{<<"ok"/utf8>>, Ok}] = Result,
[{<<"firstBatch"/utf8>>, {array, Docs}},
{<<"id"/utf8>>, _@2},
{<<"ns"/utf8>>, _@3}] = Result@1,
case Ok of
{double, 1.0} ->
{ok, Docs};
_@4 ->
{error, {mongo_error, -16, <<""/utf8>>, null}}
end;
{error, {Code, Msg}} ->
{error, {mongo_error, Code, Msg, null}}
end;
_@5 ->
{error, {mongo_error, -16, <<""/utf8>>, null}}
end.
-spec update_one(
mongo@client:collection(),
bson@types:value(),
bson@types:value(),
list(mongo@utils:update_option())
) -> {ok, update_result()} | {error, mongo@utils:mongo_error()}.
update_one(Collection, Filter, Change, Options) ->
case Filter of
{document, _@1} ->
case Change of
{document, _@2} ->
Update = [{<<"q"/utf8>>, Filter},
{<<"u"/utf8>>, Change},
{<<"multi"/utf8>>, {boolean, false}}],
Options@1 = begin
_pipe = Options,
gleam@list:fold(_pipe, [], fun(Acc, Opt) -> case Opt of
upsert ->
[{<<"upsert"/utf8>>, {boolean, true}} |
Acc];
{array_filters, Filters} ->
[{<<"arrayFilters"/utf8>>,
{array, Filters}} |
Acc]
end end)
end,
Update@1 = {document, gleam@list:append(Update, Options@1)},
case begin
_pipe@1 = Collection,
mongo@client:execute(
_pipe@1,
{document,
[{<<"update"/utf8>>,
{str, erlang:element(3, Collection)}},
{<<"updates"/utf8>>, {array, [Update@1]}}]}
)
end of
{ok,
[{<<"n"/utf8>>, {integer, N}},
{<<"nModified"/utf8>>, {integer, Modified}},
{<<"ok"/utf8>>, Ok}]} ->
case Ok of
{double, 1.0} ->
{ok, {update_result, N, Modified}};
_@3 ->
{error,
{mongo_error, -16, <<""/utf8>>, null}}
end;
{ok,
[{<<"n"/utf8>>, {integer, N@1}},
{<<"upserted"/utf8>>,
{array,
[{document,
[{<<"_id"/utf8>>, {object_id, Upserted}},
{<<"index"/utf8>>, _@4}]}]}},
{<<"nModified"/utf8>>, _@5},
{<<"ok"/utf8>>, Ok@1}]} ->
case Ok@1 of
{double, 1.0} ->
{ok, {upsert_result, N@1, Upserted}};
_@6 ->
{error,
{mongo_error, -16, <<""/utf8>>, null}}
end;
{ok,
[{<<"n"/utf8>>, _@7},
{<<"writeErrors"/utf8>>, {array, Errors}},
{<<"nModified"/utf8>>, _@8},
{<<"ok"/utf8>>, Ok@2}]} ->
case Ok@2 of
{double, 1.0} ->
{ok, Error@1} = case gleam@list:first(
Errors
) of
{ok, Error} -> {ok, Error};
_try ->
erlang:error(
#{gleam_error => assert,
message => <<"Assertion pattern match failed"/utf8>>,
value => _try,
module => <<"mongo/crud"/utf8>>,
function => <<"update_one"/utf8>>,
line => 259}
)
end,
case Error@1 of
{document,
[{<<"index"/utf8>>, _@9},
{<<"code"/utf8>>, {integer, Code}},
{<<"keyPattern"/utf8>>, _@10},
{<<"keyValue"/utf8>>, Source},
{<<"errmsg"/utf8>>, {str, Msg}}]} ->
{error,
{mongo_error, Code, Msg, Source}};
_@11 ->
{error,
{mongo_error,
-16,
<<""/utf8>>,
null}}
end;
_@12 ->
{error,
{mongo_error, -16, <<""/utf8>>, null}}
end;
{error, {Code@1, Msg@1}} ->
{error, {mongo_error, Code@1, Msg@1, null}}
end;
_@13 ->
{error, {mongo_error, -16, <<""/utf8>>, null}}
end;
_@14 ->
{error, {mongo_error, -16, <<""/utf8>>, null}}
end.
-spec update_many(
mongo@client:collection(),
bson@types:value(),
bson@types:value(),
list(mongo@utils:update_option())
) -> {ok, update_result()} | {error, mongo@utils:mongo_error()}.
update_many(Collection, Filter, Change, Options) ->
case Filter of
{document, _@1} ->
case Change of
{document, _@2} ->
Update = [{<<"q"/utf8>>, Filter},
{<<"u"/utf8>>, Change},
{<<"multi"/utf8>>, {boolean, true}}],
Options@1 = begin
_pipe = Options,
gleam@list:fold(_pipe, [], fun(Acc, Opt) -> case Opt of
upsert ->
[{<<"upsert"/utf8>>, {boolean, true}} |
Acc];
{array_filters, Filters} ->
[{<<"arrayFilters"/utf8>>,
{array, Filters}} |
Acc]
end end)
end,
Update@1 = {document, gleam@list:append(Update, Options@1)},
case begin
_pipe@1 = Collection,
mongo@client:execute(
_pipe@1,
{document,
[{<<"update"/utf8>>,
{str, erlang:element(3, Collection)}},
{<<"updates"/utf8>>, {array, [Update@1]}}]}
)
end of
{ok,
[{<<"n"/utf8>>, {integer, N}},
{<<"nModified"/utf8>>, {integer, Modified}},
{<<"ok"/utf8>>, Ok}]} ->
case Ok of
{double, 1.0} ->
{ok, {update_result, N, Modified}};
_@3 ->
{error,
{mongo_error, -16, <<""/utf8>>, null}}
end;
{ok,
[{<<"n"/utf8>>, {integer, N@1}},
{<<"upserted"/utf8>>,
{array,
[{document,
[{<<"_id"/utf8>>, {object_id, Upserted}},
{<<"index"/utf8>>, _@4}]}]}},
{<<"nModified"/utf8>>, _@5},
{<<"ok"/utf8>>, Ok@1}]} ->
case Ok@1 of
{double, 1.0} ->
{ok, {upsert_result, N@1, Upserted}};
_@6 ->
{error,
{mongo_error, -16, <<""/utf8>>, null}}
end;
{ok,
[{<<"n"/utf8>>, _@7},
{<<"writeErrors"/utf8>>, {array, Errors}},
{<<"nModified"/utf8>>, _@8},
{<<"ok"/utf8>>, Ok@2}]} ->
case Ok@2 of
{double, 1.0} ->
{ok, Error@1} = case gleam@list:first(
Errors
) of
{ok, Error} -> {ok, Error};
_try ->
erlang:error(
#{gleam_error => assert,
message => <<"Assertion pattern match failed"/utf8>>,
value => _try,
module => <<"mongo/crud"/utf8>>,
function => <<"update_many"/utf8>>,
line => 353}
)
end,
case Error@1 of
{document,
[{<<"index"/utf8>>, _@9},
{<<"code"/utf8>>, {integer, Code}},
{<<"keyPattern"/utf8>>, _@10},
{<<"keyValue"/utf8>>, Source},
{<<"errmsg"/utf8>>, {str, Msg}}]} ->
{error,
{mongo_error, Code, Msg, Source}};
_@11 ->
{error,
{mongo_error,
-16,
<<""/utf8>>,
null}}
end;
_@12 ->
{error,
{mongo_error, -16, <<""/utf8>>, null}}
end;
{error, {Code@1, Msg@1}} ->
{error, {mongo_error, Code@1, Msg@1, null}}
end;
_@13 ->
{error, {mongo_error, -16, <<""/utf8>>, null}}
end;
_@14 ->
{error, {mongo_error, -16, <<""/utf8>>, null}}
end.
-spec delete_one(mongo@client:collection(), bson@types:value()) -> {ok,
integer()} |
{error, mongo@utils:mongo_error()}.
delete_one(Collection, Filter) ->
case Filter of
{document, _@1} ->
case begin
_pipe = Collection,
mongo@client:execute(
_pipe,
{document,
[{<<"delete"/utf8>>, {str, erlang:element(3, Collection)}},
{<<"deletes"/utf8>>,
{array,
[{document,
[{<<"q"/utf8>>, Filter},
{<<"limit"/utf8>>, {integer, 1}}]}]}}]}
)
end of
{ok, [{<<"n"/utf8>>, {integer, N}}, {<<"ok"/utf8>>, Ok}]} ->
case Ok of
{double, 1.0} ->
{ok, N};
_@2 ->
{error, {mongo_error, -16, <<""/utf8>>, null}}
end;
{ok,
[{<<"n"/utf8>>, _@3},
{<<"writeErrors"/utf8>>, {array, Errors}},
{<<"ok"/utf8>>, Ok@1}]} ->
case Ok@1 of
{double, 1.0} ->
{ok, Error@1} = case gleam@list:first(Errors) of
{ok, Error} -> {ok, Error};
_try ->
erlang:error(#{gleam_error => assert,
message => <<"Assertion pattern match failed"/utf8>>,
value => _try,
module => <<"mongo/crud"/utf8>>,
function => <<"delete_one"/utf8>>,
line => 398})
end,
case Error@1 of
{document,
[{<<"index"/utf8>>, _@4},
{<<"code"/utf8>>, {integer, Code}},
{<<"keyPattern"/utf8>>, _@5},
{<<"keyValue"/utf8>>, Source},
{<<"errmsg"/utf8>>, {str, Msg}}]} ->
{error, {mongo_error, Code, Msg, Source}};
_@6 ->
{error,
{mongo_error, -16, <<""/utf8>>, null}}
end;
_@7 ->
{error, {mongo_error, -16, <<""/utf8>>, null}}
end;
{error, {Code@1, Msg@1}} ->
{error, {mongo_error, Code@1, Msg@1, null}}
end;
_@8 ->
{error, {mongo_error, -16, <<""/utf8>>, null}}
end.
-spec delete_many(mongo@client:collection(), bson@types:value()) -> {ok,
integer()} |
{error, mongo@utils:mongo_error()}.
delete_many(Collection, Filter) ->
case Filter of
{document, _@1} ->
case begin
_pipe = Collection,
mongo@client:execute(
_pipe,
{document,
[{<<"delete"/utf8>>, {str, erlang:element(3, Collection)}},
{<<"deletes"/utf8>>,
{array,
[{document,
[{<<"q"/utf8>>, Filter},
{<<"limit"/utf8>>, {integer, 0}}]}]}}]}
)
end of
{ok, [{<<"n"/utf8>>, {integer, N}}, {<<"ok"/utf8>>, Ok}]} ->
case Ok of
{double, 1.0} ->
{ok, N};
_@2 ->
{error, {mongo_error, -16, <<""/utf8>>, null}}
end;
{ok,
[{<<"n"/utf8>>, _@3},
{<<"writeErrors"/utf8>>, {array, Errors}},
{<<"ok"/utf8>>, Ok@1}]} ->
case Ok@1 of
{double, 1.0} ->
{ok, Error@1} = case gleam@list:first(Errors) of
{ok, Error} -> {ok, Error};
_try ->
erlang:error(#{gleam_error => assert,
message => <<"Assertion pattern match failed"/utf8>>,
value => _try,
module => <<"mongo/crud"/utf8>>,
function => <<"delete_many"/utf8>>,
line => 440})
end,
case Error@1 of
{document,
[{<<"index"/utf8>>, _@4},
{<<"code"/utf8>>, {integer, Code}},
{<<"keyPattern"/utf8>>, _@5},
{<<"keyValue"/utf8>>, Source},
{<<"errmsg"/utf8>>, {str, Msg}}]} ->
{error, {mongo_error, Code, Msg, Source}};
_@6 ->
{error,
{mongo_error, -16, <<""/utf8>>, null}}
end;
_@7 ->
{error, {mongo_error, -16, <<""/utf8>>, null}}
end;
{error, {Code@1, Msg@1}} ->
{error, {mongo_error, Code@1, Msg@1, null}}
end;
_@8 ->
{error, {mongo_error, -16, <<""/utf8>>, null}}
end.
-spec count_all(mongo@client:collection()) -> {ok, integer()} |
{error, mongo@utils:mongo_error()}.
count_all(Collection) ->
case begin
_pipe = Collection,
mongo@client:execute(
_pipe,
{document,
[{<<"count"/utf8>>, {str, erlang:element(3, Collection)}}]}
)
end of
{ok, [{<<"n"/utf8>>, {integer, N}}, {<<"ok"/utf8>>, Ok}]} ->
case Ok of
{double, 1.0} ->
{ok, N};
_@1 ->
{error, {mongo_error, -16, <<""/utf8>>, null}}
end;
{error, {Code, Msg}} ->
{error, {mongo_error, Code, Msg, null}}
end.
-spec count(mongo@client:collection(), bson@types:value()) -> {ok, integer()} |
{error, mongo@utils:mongo_error()}.
count(Collection, Filter) ->
case Filter of
{document, _@1} ->
case begin
_pipe = Collection,
mongo@client:execute(
_pipe,
{document,
[{<<"count"/utf8>>, {str, erlang:element(3, Collection)}},
{<<"query"/utf8>>, Filter}]}
)
end of
{ok, [{<<"n"/utf8>>, {integer, N}}, {<<"ok"/utf8>>, Ok}]} ->
case Ok of
{double, 1.0} ->
{ok, N};
_@2 ->
{error, {mongo_error, -16, <<""/utf8>>, null}}
end;
{error, {Code, Msg}} ->
{error, {mongo_error, Code, Msg, null}}
end;
_@3 ->
{error, {mongo_error, -16, <<""/utf8>>, null}}
end.