Per rispondere alla domanda su $in....
Ho eseguito alcuni test delle prestazioni con il seguente scenario:
~24 milioni di documenti in una raccolta
Cerca 1 milione di questi documenti in base a una chiave (indicizzata)
Utilizzando il driver CSharp da .NET
Risultati:
Query 1 alla volta, a thread singolo:109s
Query 1 alla volta, a thread multipli:48s
Query a 100.000 alla volta utilizzando $in, thread singolo=20s
Query 100.000 alla volta utilizzando $in, multithread=9s
Quindi prestazioni notevolmente migliori utilizzando un $in di grandi dimensioni (limitato alla dimensione massima della query).
Aggiornamento: A seguito dei commenti seguenti su come $in si comporta con dimensioni di blocchi differenti (query multi-thread):
Interrogazione di 10 alla volta (100000 batch) =8,8 s
Interrogazione di 100 alla volta (10000 batch) =4,32 s
Interrogazione di 1000 alla volta (1000 batch) =4,31 s
Interrogazione di 10000 alla volta (100 batch) =8,4s
Interrogazione di 100000 alla volta (10 batch) =9s (per i risultati originali sopra riportati)
Quindi sembra esserci un punto debole per quanti valori raggruppare in una clausola $in rispetto al numero di round trip