MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Entfernen Sie Dokumente basierend auf der Zeit eines Datumsfelds aus einer MongoDB-Sammlung

Ein regulärer Ausdruck funktioniert nicht bei etwas, das kein String ist. Es gibt eigentlich keine einfache Möglichkeit, ein BSON Date auszuwählen durch reinen Zeitwert in einem regulären Abfrageausdruck.

Dazu würden Sie einen $where Bedingung mit der zusätzlichen Logik, um nur die Zeit abzugleichen Teil des Datumswerts.

Basierend auf den tatsächlich in der Frage angegebenen Daten:

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

Das ist natürlich nur das erste Dokument in den bereitgestellten Daten, obwohl es eigentlich nur durch "Id" identifiziert wird sowieso, da dieser Wert zwischen den beiden eindeutig ist.

Der .getUTCHours() und .getUTCMinutes() sind JavaScript Date Objektmethoden, also ein BSON Date wird ausgedrückt, wenn es innerhalb eines $where verwendet wird Ausdruck.

Trivialerweise erlaubt MongoDB 3.6 (demnächst beim Schreiben) eine effizientere Form als $where in Aggregationsausdrücken:

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

Solche Ausdrücke können jedoch nicht direkt mit Methoden wie .remove() oder .deleteMany() , aber $where Ausdrücke können.