För att svara på frågan om $in....
Jag gjorde några prestandatester med följande scenario:
~24 miljoner dokument i en samling
Slå upp 1 miljon av dessa dokument baserat på en nyckel (indexerad)
Med CSharp-drivrutin från .NET
Resultat:
Fråga 1 åt gången, entrådad :109s
Fråga 1 åt gången, flertrådad:48s
Fråga 100K åt gången med $in, single threaded=20s
Fråga 100K åt gången med $in, multi threaded=9s
Så märkbart bättre prestanda med en stor $in (begränsad till maximal frågestorlek).
Uppdatering: Efter kommentarer nedan om hur $in presterar med olika chunkstorlekar (frågor med flera trådar):
Fråga 10 åt gången (100 000 batcher) =8,8 s
Fråga 100 åt gången (10 000 batcher) =4,32 s
Fråga 1 000 åt gången (1 000 batcher) =4,31 s
Fråga 10000 åt gången (100 satser) =8,4 s
Frågor om 100 000 åt gången (10 satser) =9 s (per originalresultat ovan)
Så det verkar finnas en sweet-spot för hur många värden som ska samlas in i en $in-klausul kontra antalet tur- och returresor