Próbuję utworzyć widok MongoDB, który agreguje dane włożone w ciągu ostatnich 365 dni. W moim $ Etap, przed masowaniem danych, użyłem następującego wzoru:

{
   $match: _created: { $gte: new Date((new Date()).getTime() - (365 * 24 * 60 * 60 * 1000)) }
}

Wydawało się, że działa na początku pracuje, ale potem zauważyłem, że formuła jest oceniana przed stworzeniem, a widok kończy się jako

{
   $match: _created: { $gte: ISODate('2019-10-17T21:51:10.000Z') }
}

Który oczywiście nie będzie aktualizowany w miarę upływu czasu.

Używam Mongodb Community Server V4.4.1; Czy istnieje sposób na włożenie samego formuły w widoku, a nie jego wynik statyczny?

Z góry dziękuję za wszelkie pomocne uwagi.

0
Georges 20 październik 2020, 04:55

1 odpowiedź

Najlepsza odpowiedź

Poniższy rurociąg agregacji będzie pracować z zapytaniem daty, aby znaleźć dane w ciągu ostatniego roku. Ten rurociąg można używać z widokiem.

[ { 
  $match: { 
      $expr: { 
          $gte: [ "$created", { $subtract: [ "$$NOW", 31536000000 ] } ] 
      } 
  } 
} ]

$$NOW jest agregacją Zmienna systemowa i jego wartość zostanie ustawiona na datę w momencie prowadzenia zapytania na widoku.

Wartość 31536000000 jest (365 * 24 * 60 * 60 * 1000).


[Edytuj dodaj]

Kod wypróbowany z Shell mongo (zakładając nazwę kolekcji coll za pomocą pola daty created).

// The aggregation pipeline
> var pipeline = [ { 
    $match: { 
        $expr: { 
            $gte: [ "$created", { $subtract: [ "$$NOW", 31536000000 ] } ] 
        } 
    } 
  } ]

// Create view, using the above pipeline
> db.createView(
    "coll_year_view",
    "coll",
    pipeline
)

// Query the view
> db.coll_year_view.find()
1
prasad_ 21 październik 2020, 18:54