sql >> Database >  >> NoSQL >> MongoDB

Documenten verwijderen uit een MongoDB-verzameling op basis van de tijd van een datumveld

Een reguliere expressie werkt niet op iets dat geen string is. Er is eigenlijk geen eenvoudige manier om een ​​BSON Date te selecteren puur door de tijdswaarde in een reguliere query-expressie.

Om dit te doen, levert u een $where voorwaarde met de extra logica om precies op de tijd te matchen gedeelte van de datumwaarde.

Op basis van de gegevens die daadwerkelijk in de vraag zijn verstrekt:

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

Dat is natuurlijk slechts het eerste document in de verstrekte gegevens, ook al wordt het eigenlijk alleen geïdentificeerd door "Id" hoe dan ook, aangezien die waarde uniek is tussen de twee.

De .getUTCHours() en .getUTCMinutes() zijn JavaScript Date object methoden, dat is hoe een BSON Date wordt uitgedrukt bij gebruik binnen een $where uitdrukking.

Triviaal, MongoDB 3.6 (aankomend vanaf het moment van schrijven) staat een efficiëntere vorm toe dan $where in aggregatie-uitdrukkingen:

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

Dergelijke uitdrukkingen kunnen echter niet rechtstreeks worden gebruikt met methoden zoals .remove() of .deleteMany() , maar $where uitdrukkingen kunnen.



  1. fout in monogdb errmsg:WiredTigerIndex::insert:sleutel te groot om te indexeren, mislukt

  2. MongoDB $indexOfCP

  3. Sorteer geneste reeks objecten

  4. MongoDB $sin