MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

mongodb:zapytanie o okres między dwoma polami daty

Najlepszą opcją jest użycie $redact etap potoku agregacji:

db.collection.aggregate([
    { "$redact": {
        "$cond": {
            "if": {
                "$gt": [
                    { "$subtract": [ "$lastUpdate", "$createdDate" ] },
                    1000 * 60 * 60 * 24
                ]
            },
            "then": "$$KEEP",
            "else": "$$PRUNE"
        }
    }}
])

Więc patrzysz na wartość w milisekundach z różnicy, która jest większa niż wartość w milisekundach dla jednego dnia. $subtract oblicza różnicę, a gdy odejmuje się dwie daty, zwracana jest różnica w milisekundach.

$redact operator przyjmuje logiczne wyrażenie jako „jeśli”, a warunek jest true wykonuje akcję w "then", czyli $$KEEP dokument. Gdzie to jest false następnie dokument jest usuwany z wyników za pomocą $$PRUNE .

Zwróć uwagę, że ponieważ jest to warunek logiczny, a nie ustawiona wartość lub zakres wartości, „indeks” nie jest używany.

Ponieważ operacje w potoku agregacji są kodowane natywnie, jest to najszybsze wykonanie takiej instrukcji, jakie można uzyskać.

Alternatywą jest ocena JavaScript z $where . Pobiera to wyrażenie funkcji JavaScript, które podobnie musi zwracać true lub false wartość. W powłoce możesz użyć skrótu w ten sposób:

db.collection.find(function() {
    return ( this.lastUpdate.valueOf() - this.createdDate.valueOf() )
       > ( 1000 * 60 * 60 * 24 );
})

To samo, z wyjątkiem tego, że ewaluacja JavaScript wymaga interpretacji i będzie działać znacznie wolniej niż .aggregate() równowartość. Z tego samego powodu ten typ wyrażenia nie może używać indeksu do optymalizacji wydajności.

Dla najlepszych wyniki, zapisz różnicę w dokumencie. Następnie możesz po prostu zapytać bezpośrednio o tę właściwość i oczywiście możesz ją również zindeksować.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB - Utwórz kopię zapasową

  2. mongodb $istnieje zawsze zwraca 0

  3. Jak wyszukiwać różne wartości w Mongoose?

  4. Wstawka partii Mongoose (mongodb)?

  5. arrayFilters w mongodb