Ein regulärer Ausdruck funktioniert nicht bei etwas, das kein String ist. Es gibt eigentlich keine einfache Möglichkeit, ein BSON Date
auszuwählen durch reinen Zeitwert in einem regulären Abfrageausdruck.
Dazu würden Sie einen $where
Bedingung mit der zusätzlichen Logik, um nur die Zeit abzugleichen Teil des Datumswerts.
Basierend auf den tatsächlich in der Frage angegebenen Daten:
db.getCollection('collection').remove({
"Id": "1585534",
"Type": NumberInt(42),
"$where": function() {
return this.InDate.getUTCHours() === 18
&& this.InDate.getUTCMinutes() === 30
}
})
Das ist natürlich nur das erste Dokument in den bereitgestellten Daten, obwohl es eigentlich nur durch "Id"
identifiziert wird sowieso, da dieser Wert zwischen den beiden eindeutig ist.
Der .getUTCHours()
und .getUTCMinutes()
sind JavaScript Date
Objektmethoden, also ein BSON Date
wird ausgedrückt, wenn es innerhalb eines $where
verwendet wird
Ausdruck.
Trivialerweise erlaubt MongoDB 3.6 (demnächst beim Schreiben) eine effizientere Form als $where
in Aggregationsausdrücken:
db.getCollection('collection').aggregate([
{ "$match": {
"Id": "1585534",
"Type": NumberInt(42),
"$expr": {
"$and": [
{ "$eq": [{ "$hour": "$InDate" }, 18 ] },
{ "$eq": [{ "$minute": "$InDate" }, 30] }
]
}
}}
])
Solche Ausdrücke können jedoch nicht direkt mit Methoden wie .remove()
oder .deleteMany()
, aber $where
Ausdrücke können.