@@ -273,7 +273,7 @@ defmodule Mongo do
273
273
@ spec find_one_and_update ( GenServer . server , collection , BSON . document , BSON . document , Keyword . t ) :: result ( BSON . document ) | { :ok , nil }
274
274
def find_one_and_update ( topology_pid , coll , filter , update , opts \\ [ ] ) do
275
275
_ = modifier_docs ( update , :update )
276
- query = [
276
+ cmd = [
277
277
findAndModify: coll ,
278
278
query: filter ,
279
279
update: update ,
@@ -289,13 +289,12 @@ defmodule Mongo do
289
289
opts = Keyword . drop ( opts , ~w( bypass_document_validation max_time projection return_document sort upsert collation) a )
290
290
291
291
with { :ok , conn , _ , _ } <- select_server ( topology_pid , :write , opts ) ,
292
- { :ok , doc } <- direct_command ( conn , query , opts ) do
292
+ { :ok , doc } <- exec_command ( conn , cmd , opts ) do
293
293
{ :ok , doc [ "value" ] }
294
294
end
295
295
296
296
end
297
297
298
-
299
298
@ doc """
300
299
Finds a document and replaces it.
301
300
@@ -317,7 +316,7 @@ defmodule Mongo do
317
316
@ spec find_one_and_replace ( GenServer . server , collection , BSON . document , BSON . document , Keyword . t ) :: result ( BSON . document )
318
317
def find_one_and_replace ( topology_pid , coll , filter , replacement , opts \\ [ ] ) do
319
318
_ = modifier_docs ( replacement , :replace )
320
- query = [
319
+ cmd = [
321
320
findAndModify: coll ,
322
321
query: filter ,
323
322
update: replacement ,
@@ -333,7 +332,7 @@ defmodule Mongo do
333
332
opts = Keyword . drop ( opts , ~w( bypass_document_validation max_time projection return_document sort upsert collation) a )
334
333
335
334
with { :ok , conn , _ , _ } <- select_server ( topology_pid , :write , opts ) ,
336
- { :ok , doc } <- direct_command ( conn , query , opts ) , do: { :ok , doc [ "value" ] }
335
+ { :ok , doc } <- exec_command ( conn , cmd , opts ) , do: { :ok , doc [ "value" ] }
337
336
end
338
337
339
338
defp should_return_new ( :after ) , do: true
@@ -352,7 +351,7 @@ defmodule Mongo do
352
351
"""
353
352
@ spec find_one_and_delete ( GenServer . server , collection , BSON . document , Keyword . t ) :: result ( BSON . document )
354
353
def find_one_and_delete ( topology_pid , coll , filter , opts \\ [ ] ) do
355
- query = [
354
+ cmd = [
356
355
findAndModify: coll ,
357
356
query: filter ,
358
357
remove: true ,
@@ -364,13 +363,13 @@ defmodule Mongo do
364
363
opts = Keyword . drop ( opts , ~w( max_time projection sort collation) a )
365
364
366
365
with { :ok , conn , _ , _ } <- select_server ( topology_pid , :write , opts ) ,
367
- { :ok , doc } <- direct_command ( conn , query , opts ) , do: { :ok , doc [ "value" ] }
366
+ { :ok , doc } <- exec_command ( conn , cmd , opts ) , do: { :ok , doc [ "value" ] }
368
367
end
369
368
370
369
@ doc false
371
370
@ spec count ( GenServer . server , collection , BSON . document , Keyword . t ) :: result ( non_neg_integer )
372
371
def count ( topology_pid , coll , filter , opts \\ [ ] ) do
373
- query = [
372
+ cmd = [
374
373
count: coll ,
375
374
query: filter ,
376
375
limit: opts [ :limit ] ,
@@ -382,7 +381,7 @@ defmodule Mongo do
382
381
opts = Keyword . drop ( opts , ~w( limit skip hint collation) a )
383
382
384
383
# Mongo 2.4 and 2.6 returns a float
385
- with { :ok , doc } <- command ( topology_pid , query , opts ) ,
384
+ with { :ok , doc } <- command ( topology_pid , cmd , opts ) ,
386
385
do: { :ok , trunc ( doc [ "n" ] ) }
387
386
end
388
387
@@ -456,7 +455,7 @@ defmodule Mongo do
456
455
"""
457
456
@ spec distinct ( GenServer . server , collection , String . t | atom , BSON . document , Keyword . t ) :: result ( [ BSON . t ] )
458
457
def distinct ( topology_pid , coll , field , filter , opts \\ [ ] ) do
459
- query = [
458
+ cmd = [
460
459
distinct: coll ,
461
460
key: field ,
462
461
query: filter ,
@@ -468,7 +467,7 @@ defmodule Mongo do
468
467
469
468
with { :ok , conn , slave_ok , _ } <- select_server ( topology_pid , :read , opts ) ,
470
469
opts = Keyword . put ( opts , :slave_ok , slave_ok ) ,
471
- { :ok , doc } <- direct_command ( conn , query , opts ) ,
470
+ { :ok , doc } <- exec_command ( conn , cmd , opts ) ,
472
471
do: { :ok , doc [ "values" ] }
473
472
end
474
473
@@ -562,20 +561,21 @@ defmodule Mongo do
562
561
in the document.
563
562
"""
564
563
@ spec command ( GenServer . server , BSON . document , Keyword . t ) :: result ( BSON . document )
565
- def command ( topology_pid , query , opts \\ [ ] ) do
564
+ def command ( topology_pid , cmd , opts \\ [ ] ) do
566
565
rp = ReadPreference . defaults ( % { mode: :primary } )
567
566
rp_opts = [ read_preference: Keyword . get ( opts , :read_preference , rp ) ]
568
567
with { :ok , conn , slave_ok , _ } <- select_server ( topology_pid , :read , rp_opts ) ,
569
568
opts = Keyword . put ( opts , :slave_ok , slave_ok ) ,
570
- do: direct_command ( conn , query , opts )
569
+ do: exec_command ( conn , cmd , opts )
571
570
end
572
571
573
572
@ doc false
574
- @ spec direct_command ( pid , BSON . document , Keyword . t ) :: { :ok , BSON . document | nil } | { :error , Mongo.Error . t }
575
- def direct_command ( conn , cmd , opts \\ [ ] ) do
573
+ ## refactor: exec_command
574
+ @ spec exec_command ( pid , BSON . document , Keyword . t ) :: { :ok , BSON . document | nil } | { :error , Mongo.Error . t }
575
+ def exec_command ( conn , cmd , opts ) do
576
576
action = % Query { action: :command }
577
577
578
- with { :ok , _query , doc } <- DBConnection . execute ( conn , action , [ cmd ] , defaults ( opts ) ) ,
578
+ with { :ok , _cmd , doc } <- DBConnection . execute ( conn , action , [ cmd ] , defaults ( opts ) ) ,
579
579
{ :ok , doc } <- check_for_error ( doc ) do
580
580
{ :ok , doc }
581
581
end
@@ -587,19 +587,31 @@ defmodule Mongo do
587
587
@ doc """
588
588
Returns the current wire version.
589
589
"""
590
- def wire_version ( conn , opts \\ [ ] ) do
590
+ @ spec wire_version ( pid ) :: { :ok , integer } | { :error , Mongo.Error . t }
591
+ def wire_version ( conn ) do
591
592
cmd = % Query { action: :wire_version }
592
- with { :ok , _query , version } <- DBConnection . execute ( conn , cmd , % { } , defaults ( opts ) ) do
593
+ with { :ok , _cmd , version } <- DBConnection . execute ( conn , cmd , % { } , defaults ( [ ] ) ) do
593
594
{ :ok , version }
594
595
end
595
596
end
596
597
598
+ @ doc """
599
+ Returns the limits of the database.
600
+ """
601
+ @ spec limits ( pid ) :: { :ok , BSON . document } | { :error , Mongo.Error . t }
602
+ def limits ( conn ) do
603
+ cmd = % Query { action: :limits }
604
+ with { :ok , _cmd , limits } <- DBConnection . execute ( conn , cmd , % { } , defaults ( [ ] ) ) do
605
+ { :ok , limits }
606
+ end
607
+ end
608
+
597
609
@ doc """
598
610
Similar to `command/3` but unwraps the result and raises on error.
599
611
"""
600
612
@ spec command! ( GenServer . server , BSON . document , Keyword . t ) :: result! ( BSON . document )
601
- def command! ( topology_pid , query , opts \\ [ ] ) do
602
- bangify ( command ( topology_pid , query , opts ) )
613
+ def command! ( topology_pid , cmd , opts \\ [ ] ) do
614
+ bangify ( command ( topology_pid , cmd , opts ) )
603
615
end
604
616
605
617
@ doc """
@@ -640,7 +652,7 @@ defmodule Mongo do
640
652
] |> filter_nils ( )
641
653
642
654
with { :ok , conn , _ , _ } <- select_server ( topology_pid , :write , opts ) ,
643
- { :ok , doc } <- direct_command ( conn , cmd , opts ) do
655
+ { :ok , doc } <- exec_command ( conn , cmd , opts ) do
644
656
case doc do
645
657
% { "writeErrors" => _ } -> { :error , % Mongo.WriteError { n: doc [ "n" ] , ok: doc [ "ok" ] , write_errors: doc [ "writeErrors" ] } }
646
658
_ ->
@@ -685,7 +697,7 @@ defmodule Mongo do
685
697
wtimeout: Keyword . get ( opts , :wtimeout )
686
698
} |> filter_nils ( )
687
699
688
- query = [
700
+ cmd = [
689
701
insert: coll ,
690
702
documents: docs ,
691
703
ordered: Keyword . get ( opts , :ordered ) ,
@@ -694,7 +706,7 @@ defmodule Mongo do
694
706
] |> filter_nils ( )
695
707
696
708
with { :ok , conn , _ , _ } <- select_server ( topology_pid , :write , opts ) ,
697
- { :ok , doc } <- direct_command ( conn , query , opts ) do
709
+ { :ok , doc } <- exec_command ( conn , cmd , opts ) do
698
710
case doc do
699
711
% { "writeErrors" => _ } -> { :error , % Mongo.WriteError { n: doc [ "n" ] , ok: doc [ "ok" ] , write_errors: doc [ "writeErrors" ] } }
700
712
_ ->
@@ -757,15 +769,15 @@ defmodule Mongo do
757
769
collation: Keyword . get ( opts , :collation )
758
770
} |> filter_nils ( )
759
771
760
- query = [
772
+ cmd = [
761
773
delete: coll ,
762
774
deletes: [ filter ] ,
763
775
ordered: Keyword . get ( opts , :ordered ) ,
764
776
writeConcern: write_concern
765
777
] |> filter_nils ( )
766
778
767
779
with { :ok , conn , _ , _ } <- select_server ( topology_pid , :write , opts ) ,
768
- { :ok , doc } <- direct_command ( conn , query , opts ) do
780
+ { :ok , doc } <- exec_command ( conn , cmd , opts ) do
769
781
case doc do
770
782
% { "writeErrors" => _ } -> { :error , % Mongo.WriteError { n: doc [ "n" ] , ok: doc [ "ok" ] , write_errors: doc [ "writeErrors" ] } }
771
783
% { "ok" => _ok , "n" => n } ->
@@ -885,7 +897,7 @@ defmodule Mongo do
885
897
] |> filter_nils ( )
886
898
887
899
with { :ok , conn , _ , _ } <- select_server ( topology_pid , :write , opts ) ,
888
- { :ok , doc } <- direct_command ( conn , cmd , opts ) do
900
+ { :ok , doc } <- exec_command ( conn , cmd , opts ) do
889
901
890
902
case doc do
891
903
@@ -966,7 +978,7 @@ defmodule Mongo do
966
978
def select_server ( topology_pid , type , opts \\ [ ] ) do
967
979
with { :ok , servers , slave_ok , mongos? } <- select_servers ( topology_pid , type , opts ) do
968
980
if Enum . empty? servers do
969
- { :ok , nil , slave_ok , mongos? } # todo: warum wird [] zurückgeliefert?, nil wäre besser?
981
+ { :ok , nil , slave_ok , mongos? }
970
982
else
971
983
with { :ok , connection } <- servers |> Enum . take_random ( 1 ) |> Enum . at ( 0 )
972
984
|> get_connection ( topology_pid ) do
0 commit comments