MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Supprimer des documents d'une collection MongoDB en fonction de l'heure d'un champ Date

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.