MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Премахване на документи от колекция MongoDB въз основа на час на поле за дата

Регулярният израз няма да работи върху нещо, което не е низ. Всъщност няма лесен начин за избор на BSON дата чрез чисто времева стойност в израз на регулярна заявка.

За да направите това, трябва да предоставите $where условие с допълнителна логика за съвпадение само на времето част от стойността на датата.

Въз основа на данните, действително предоставени във въпроса:

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

Което разбира се е само първият документ в предоставените данни, въпреки че всъщност е идентифициран само с „Id“ така или иначе, тъй като тази стойност е уникална между двете.

.getUTCHours() и .getUTCMinutes() са JavaScript Дата обектни методи, което представлява BSON дата се изразява, когато се използва в рамките на $where израз.

Тривиално, MongoDB 3.6 (предстоящ към писането) позволява по-ефективна форма от $where в изрази за агрегиране:

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

Такива изрази обаче не могат да се използват директно с методи като .remove() или .deleteMany() , но $where изразите могат.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Персонализирани съобщения за грешки с Mongoose

  2. MongoDB - Пуснете колекция

  3. Поддържа ли Spring Data MongoDb оператор за агрегиране на масив $filter?

  4. ReferenceField с препратка към съществуващ документ

  5. Моделиране много към много :чрез с Mongoid/MongoDB