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

Fjern dokumenter fra en MongoDB-samling baseret på tidspunktet for et Dato-felt

Et regulært udtryk fungerer ikke på noget, der ikke er en streng. Der er faktisk ingen enkel måde at vælge en BSON-dato på udelukkende ved at det er tidsværdi i et regulært forespørgselsudtryk.

For at gøre dette skal du levere en $where tilstand med den ekstra logik, der matcher på netop tidspunktet del af datoværdien.

Baseret på de faktiske oplysninger i spørgsmålet:

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

Hvilket selvfølgelig kun er det første dokument i de leverede data, selvom det egentlig bare er identificeret med "Id" alligevel, da denne værdi er unik mellem de to.

.getUTCHours() og .getUTCMinutes() er JavaScript Dato objektmetoder, hvilket er hvordan en BSON-dato er udtrykt, når det bruges i en $where udtryk.

Trivielt tillader MongoDB 3.6 ( kommende i skrivende stund ) en mere effektiv form end $where i aggregeringsudtryk:

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

Sådanne udtryk kan dog ikke bruges direkte med metoder såsom .remove() eller .deleteMany() , men $where udtryk kan.



  1. Hvordan bruger man $add inde i update()-funktionen i Mongo?

  2. Mongodb samler (tæller) på flere felter samtidigt

  3. Mongo DB med C# - dokument tilføjet uanset transaktion

  4. pymongo:MongoClient eller Connection