Een reguliere expressie werkt niet op iets dat geen string is. Er is eigenlijk geen eenvoudige manier om een BSON Date
te selecteren puur door de tijdswaarde in een reguliere query-expressie.
Om dit te doen, levert u een $where
voorwaarde met de extra logica om precies op de tijd te matchen gedeelte van de datumwaarde.
Op basis van de gegevens die daadwerkelijk in de vraag zijn verstrekt:
db.getCollection('collection').remove({
"Id": "1585534",
"Type": NumberInt(42),
"$where": function() {
return this.InDate.getUTCHours() === 18
&& this.InDate.getUTCMinutes() === 30
}
})
Dat is natuurlijk slechts het eerste document in de verstrekte gegevens, ook al wordt het eigenlijk alleen geïdentificeerd door "Id"
hoe dan ook, aangezien die waarde uniek is tussen de twee.
De .getUTCHours()
en .getUTCMinutes()
zijn JavaScript Date
object methoden, dat is hoe een BSON Date
wordt uitgedrukt bij gebruik binnen een $where
uitdrukking.
Triviaal, MongoDB 3.6 (aankomend vanaf het moment van schrijven) staat een efficiëntere vorm toe dan $where
in aggregatie-uitdrukkingen:
db.getCollection('collection').aggregate([
{ "$match": {
"Id": "1585534",
"Type": NumberInt(42),
"$expr": {
"$and": [
{ "$eq": [{ "$hour": "$InDate" }, 18 ] },
{ "$eq": [{ "$minute": "$InDate" }, 30] }
]
}
}}
])
Dergelijke uitdrukkingen kunnen echter niet rechtstreeks worden gebruikt met methoden zoals .remove()
of .deleteMany()
, maar $where
uitdrukkingen kunnen.