sql >> Databasteknik >  >> NoSQL >> MongoDB

Ta bort dokument från en MongoDB-samling baserat på tidpunkten för ett datumfält

Ett reguljärt uttryck fungerar inte på något som inte är en sträng. Det finns faktiskt inget enkelt sätt att välja ett BSON-datum av enbart det är tidsvärde i ett reguljärt frågeuttryck.

För att göra detta skulle du ange en $where villkoret med den extra logiken för att matcha just vid tiden del av datumvärdet.

Baserat på de uppgifter som faktiskt tillhandahålls i frågan:

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

Vilket naturligtvis bara är det första dokumentet i den tillhandahållna datan, även om det egentligen bara identifieras av "Id" i alla fall eftersom det värdet är unikt mellan de två.

.getUTCHours() och .getUTCMinutes() är JavaScript Datum objektmetoder, vilket är hur ett BSON-datum uttrycks när det används inom en $where uttryck.

Trivialt, MongoDB 3.6 (kommande i skrivande stund) tillåter en mer effektiv form än $where i aggregeringsuttryck:

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

Sådana uttryck kan dock inte användas direkt med metoder som .remove() eller .deleteMany() , men $where uttryck kan.



  1. MongoDB aggregeras inom daglig gruppering

  2. Mongodb find() fråga:returnerar endast unika värden (inga dubbletter)

  3. Uppdatera flera dokument i en samling med hjälp av växellåda

  4. Duplicerat nyckelfel med mongodb 2dsphere unikt index