MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Rimuovere i documenti da una raccolta MongoDB in base all'ora di un campo Data

Un'espressione regolare non funzionerà su qualcosa che non sia una stringa. In realtà non esiste un modo semplice per selezionare una BSON Date semplicemente è il valore del tempo in un'espressione di query regolare.

Per fare ciò dovresti fornire un $where condizione con la logica aggiuntiva da abbinare solo al tempo parte del valore della data.

Sulla base dei dati effettivamente forniti nella domanda:

db.getCollection('collection').remove({
  "Id": "1585534",
  "Type": NumberInt(42),
  "$where": function() {
    return this.InDate.getUTCHours() === 18
      && this.InDate.getUTCMinutes() === 30
  }
})

Che ovviamente è solo il primo documento nei dati forniti, anche se in realtà è identificato solo da "Id" comunque poiché quel valore è unico tra i due.

Il .getUTCHours() e .getUTCMinutes() sono JavaScript Date metodi oggetto, che è come un BSON Date è espresso quando utilizzato all'interno di un $where espressione.

Banalmente, MongoDB 3.6 (in arrivo al momento della scrittura) consente un modulo più efficiente di $where nelle espressioni di aggregazione:

db.getCollection('collection').aggregate([
  { "$match": {
    "Id": "1585534",
    "Type": NumberInt(42),
    "$expr": {
      "$and": [
        { "$eq": [{ "$hour": "$InDate" }, 18 ] },
        { "$eq": [{ "$minute": "$InDate" }, 30] } 
      ] 
    }   
  }}
])

Tuttavia tali espressioni non possono essere utilizzate direttamente con metodi come .remove() o .deleteMany() , ma $where le espressioni possono.