sql >> Base de Datos >  >> NoSQL >> MongoDB

Eliminar documentos de una colección de MongoDB en función de la hora de un campo de fecha

Una expresión regular no funcionará en algo que no sea una cadena. En realidad, no existe una forma sencilla de seleccionar una BSON Date puramente por su valor de tiempo en una expresión de consulta regular.

Para hacer esto, debe proporcionar un $where condición con la lógica adicional para hacer coincidir solo el tiempo parte del valor de la fecha.

Basado en los datos realmente proporcionados en la pregunta:

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

Que, por supuesto, es solo el primer documento en los datos proporcionados, aunque en realidad solo se identifica con "Id" de todos modos, ya que ese valor es único entre los dos.

El .getUTCHours() y .getUTCMinutes() son JavaScript Date métodos de objetos, que es como un BSON Date se expresa cuando se usa dentro de un $where expresión.

Trivialmente, MongoDB 3.6 (próximamente al momento de escribir) permite una forma más eficiente que $where en expresiones de agregación:

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

Sin embargo, tales expresiones no se pueden usar directamente con métodos como .remove() o .deleteMany() , pero $where las expresiones pueden.