Um das Q über $in zu beantworten....
Ich habe einige Leistungstests mit dem folgenden Szenario durchgeführt:
~24 Millionen Dokumente in einer Sammlung
Suchen Sie 1 Million dieser Dokumente basierend auf einem Schlüssel (indiziert)
Mit dem CSharp-Treiber von .NET
Ergebnisse:
Abfrage 1 auf einmal, Single-Threaded:109s
Abfrage 1 auf einmal, Multi-Threaded:48s
Abfrage von 100K auf einmal mit $in, Single-Threaded=20s
Abfrage 100 KB auf einmal mit $in, multithreaded=9s
Also merklich bessere Leistung mit einem großen $in (beschränkt auf die maximale Abfragegröße).
Aktualisierung: Weiter unten in den Kommentaren darüber, wie $in mit unterschiedlichen Chunk-Größen abschneidet (Abfragen mit mehreren Threads):
10 Abfragen auf einmal (100000 Batches) =8,8 s
100 Abfragen auf einmal (10000 Batches) =4,32 s
1000 Abfragen auf einmal (1000 Batches) =4,31 s
10000 Abfragen auf einmal (100 Batches) =8,4 s
Abfrage von 100000 auf einmal (10 Batches) =9 s (gemäß den ursprünglichen Ergebnissen oben)
Es scheint also einen idealen Punkt dafür zu geben, wie viele Werte in einer $in-Klausel im Vergleich zur Anzahl der Roundtrips zusammengefasst werden sollen