Du behöver inte något av denna inpackning. Ett datum är ett datum :
var zeroth = {$or:[ {start: new Date(), {users:{$size:2}} ]};
Nu förstås om dessa "datum" i ditt dokument faktiskt är "strängar" och inte korrekt datum typer så är det ditt problem. Och vad du egentligen måste fixa dessa värden så att de är riktiga datum.
Detta gäller alla språkimplementering, där du bör arbeta med den ursprungliga "datum"-typen och låta föraren göra omvandlingen åt dig.
Hur man avgör om fältet är en sträng
Den tydliga skillnaden är när du tittar på ett dokument i mongo-skalet, om det är en riktig BSON-datumtyp kommer det att se ut så här:
"start": ISODate("2014-03-31T08:47:48.946Z"),
Om det inte är tillräckligt tydligt finns det $type
operator som du kan använda i en fråga som denna:
db.collection.find({ "start": { "$type": 2 } }).count()
Det är också inte MongoDB som gör detta om det är en sträng, men snarare dålig implementering i applikationen eller importen som var ansvarig för att skapa detta. Vilket var vad poängen i det första svaret handlade om.