MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Remover documentos de uma coleção do MongoDB com base na hora de um campo Data


Uma Expressão Regular não funcionará em algo que não seja uma string. Na verdade, não há uma maneira simples de selecionar uma BSON Date puramente por seu valor de tempo em uma expressão de consulta regular.

Para fazer isso, você forneceria um $where condição com a lógica adicional para corresponder apenas no tempo parte do valor da data.

Com base nos dados realmente fornecidos na pergunta:
db.getCollection('collection').remove({
  "Id": "1585534",
  "Type": NumberInt(42),
  "$where": function() {
    return this.InDate.getUTCHours() === 18
      && this.InDate.getUTCMinutes() === 30
  }
})

Que é, obviamente, apenas o primeiro documento nos dados fornecidos, mesmo que seja apenas identificado por "Id" de qualquer forma, uma vez que esse valor é único entre os dois.

O .getUTCHours() e .getUTCMinutes() são JavaScript Data métodos de objeto, que é como um BSON Date é expresso quando usado em um $where expressão.

Trivialmente, o MongoDB 3.6 (no momento da escrita) permite uma forma mais eficiente do que $onde em expressões de agregação:
db.getCollection('collection').aggregate([
  { "$match": {
    "Id": "1585534",
    "Type": NumberInt(42),
    "$expr": {
      "$and": [
        { "$eq": [{ "$hour": "$InDate" }, 18 ] },
        { "$eq": [{ "$minute": "$InDate" }, 30] } 
      ] 
    }   
  }}
])

No entanto, essas expressões não podem ser usadas diretamente com métodos como .remove() ou .deleteMany() , mas $where expressões podem.