Ett reguljärt uttryck fungerar inte på något som inte är en sträng. Det finns faktiskt inget enkelt sätt att välja ett BSON-datum
av enbart det är tidsvärde i ett reguljärt frågeuttryck.
För att göra detta skulle du ange en $where
villkoret med den extra logiken för att matcha just vid tiden del av datumvärdet.
Baserat på de uppgifter som faktiskt tillhandahålls i frågan:
db.getCollection('collection').remove({
"Id": "1585534",
"Type": NumberInt(42),
"$where": function() {
return this.InDate.getUTCHours() === 18
&& this.InDate.getUTCMinutes() === 30
}
})
Vilket naturligtvis bara är det första dokumentet i den tillhandahållna datan, även om det egentligen bara identifieras av "Id"
i alla fall eftersom det värdet är unikt mellan de två.
.getUTCHours()
och .getUTCMinutes()
är JavaScript Datum
objektmetoder, vilket är hur ett BSON-datum
uttrycks när det används inom en $where
uttryck.
Trivialt, MongoDB 3.6 (kommande i skrivande stund) tillåter en mer effektiv form än $where
i aggregeringsuttryck:
db.getCollection('collection').aggregate([
{ "$match": {
"Id": "1585534",
"Type": NumberInt(42),
"$expr": {
"$and": [
{ "$eq": [{ "$hour": "$InDate" }, 18 ] },
{ "$eq": [{ "$minute": "$InDate" }, 30] }
]
}
}}
])
Sådana uttryck kan dock inte användas direkt med metoder som .remove()
eller .deleteMany()
, men $where
uttryck kan.