Wyrażenie regularne nie zadziała na czymś, co nie jest ciągiem. Właściwie nie ma prostego sposobu na wybranie Daty BSON
przez samą wartość czasu w zwykłym wyrażeniu zapytania.
W tym celu podaj $where
warunek z dodatkową logiką do dopasowania tylko w czasie część wartości daty.
Na podstawie danych faktycznie dostarczonych w pytaniu:
db.getCollection('collection').remove({
"Id": "1585534",
"Type": NumberInt(42),
"$where": function() {
return this.InDate.getUTCHours() === 18
&& this.InDate.getUTCMinutes() === 30
}
})
Który jest oczywiście tylko pierwszym dokumentem w dostarczonych danych, mimo że tak naprawdę jest identyfikowany przez "Id"
w każdym razie, ponieważ ta wartość jest unikalna między nimi.
.getUTCHours()
i .getUTCMinutes()
są JavaScript Data
metody obiektowe, czyli jak BSON Date
jest wyrażany, gdy jest używany w $where
wyrażenie.
Co oczywiste, MongoDB 3.6 (wkrótce w momencie pisania) pozwala na bardziej wydajną formę niż $gdzie
w wyrażeniach agregujących:
db.getCollection('collection').aggregate([
{ "$match": {
"Id": "1585534",
"Type": NumberInt(42),
"$expr": {
"$and": [
{ "$eq": [{ "$hour": "$InDate" }, 18 ] },
{ "$eq": [{ "$minute": "$InDate" }, 30] }
]
}
}}
])
Jednak takich wyrażeń nie można używać bezpośrednio z metodami takimi jak .remove()
lub .deleteMany()
, ale $where
wyrażenia mogą.