Non hai bisogno di nessuno di questi involucri. Una data è una data :
var zeroth = {$or:[ {start: new Date(), {users:{$size:2}} ]};
Ora, ovviamente, se quelle "date" nel tuo documento sono in realtà "stringhe" e non una corretta data tipi allora questo è il tuo problema. E quello che davvero necessario è correggere quei valori in modo che siano date reali.
Questo vale per qualsiasi implementazione della lingua, in cui dovresti lavorare con il tipo "data" nativo e lasciare che il driver esegua la conversione per te.
Come determinare se il campo è una stringa
Bene, la chiara differenza è che quando guardi un documento nella mongo shell, se è un tipo di data BSON reale, sarà simile a questo:
"start": ISODate("2014-03-31T08:47:48.946Z"),
Se ciò non è abbastanza chiaro, c'è il $type
operatore che puoi utilizzare in una query come questa:
db.collection.find({ "start": { "$type": 2 } }).count()
Inoltre non MongoDB che sta facendo questo se si tratta di una stringa, ma piuttosto una cattiva implementazione nell'applicazione o importazione responsabile della creazione di questo. Su questo si basavano i punti evidenziati nella risposta iniziale.