Et regulært udtryk fungerer ikke på noget, der ikke er en streng. Der er faktisk ingen enkel måde at vælge en BSON-dato
på udelukkende ved at det er tidsværdi i et regulært forespørgselsudtryk.
For at gøre dette skal du levere en $where
tilstand med den ekstra logik, der matcher på netop tidspunktet del af datoværdien.
Baseret på de faktiske oplysninger i spørgsmålet:
db.getCollection('collection').remove({
"Id": "1585534",
"Type": NumberInt(42),
"$where": function() {
return this.InDate.getUTCHours() === 18
&& this.InDate.getUTCMinutes() === 30
}
})
Hvilket selvfølgelig kun er det første dokument i de leverede data, selvom det egentlig bare er identificeret med "Id"
alligevel, da denne værdi er unik mellem de to.
.getUTCHours()
og .getUTCMinutes()
er JavaScript Dato
objektmetoder, hvilket er hvordan en BSON-dato
er udtrykt, når det bruges i en $where
udtryk.
Trivielt tillader MongoDB 3.6 ( kommende i skrivende stund ) en mere effektiv form end $where
i aggregeringsudtryk:
db.getCollection('collection').aggregate([
{ "$match": {
"Id": "1585534",
"Type": NumberInt(42),
"$expr": {
"$and": [
{ "$eq": [{ "$hour": "$InDate" }, 18 ] },
{ "$eq": [{ "$minute": "$InDate" }, 30] }
]
}
}}
])
Sådanne udtryk kan dog ikke bruges direkte med metoder såsom .remove()
eller .deleteMany()
, men $where
udtryk kan.