Une expression régulière ne fonctionnera pas sur quelque chose qui n'est pas une chaîne. Il n'existe en fait aucun moyen simple de sélectionner une BSON Date
uniquement par sa valeur temporelle dans une expression de requête régulière.
Pour ce faire, vous devez fournir un $where
condition avec la logique supplémentaire pour correspondre uniquement à l'heure partie de la valeur de date.
Sur la base des données réellement fournies dans la question :
db.getCollection('collection').remove({
"Id": "1585534",
"Type": NumberInt(42),
"$where": function() {
return this.InDate.getUTCHours() === 18
&& this.InDate.getUTCMinutes() === 30
}
})
Ce qui n'est bien sûr que le premier document dans les données fournies, même s'il est en fait juste identifié par "Id"
de toute façon puisque cette valeur est unique entre les deux.
Le .getUTCHours()
et .getUTCMinutes()
sont JavaScript Date
les méthodes d'objet, c'est-à-dire comment une BSON Date
est exprimé lorsqu'il est utilisé dans un $where
expression.
Trivialement, MongoDB 3.6 (à venir au moment de l'écriture) permet une forme plus efficace que $where
dans les expressions d'agrégation :
db.getCollection('collection').aggregate([
{ "$match": {
"Id": "1585534",
"Type": NumberInt(42),
"$expr": {
"$and": [
{ "$eq": [{ "$hour": "$InDate" }, 18 ] },
{ "$eq": [{ "$minute": "$InDate" }, 30] }
]
}
}}
])
Cependant, de telles expressions ne peuvent pas être utilisées directement avec des méthodes telles que .remove()
ou .deleteMany()
, mais $where
les expressions peuvent.