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

Uzyskiwanie uniksowego znacznika czasu w sekundach z MongoDB ISODate podczas agregacji

Nie jestem pewien, dlaczego uważasz, że potrzebujesz wartości w sekundach, a nie w milisekundach, ponieważ ogólnie obie formy są prawidłowe, a w większości implementacji językowych preferowane są milisekundy. Ale ogólnie rzecz biorąc, próba przekształcenia tego w ciąg znaków jest złym sposobem na obejście tego i zazwyczaj po prostu wykonujesz obliczenia:

db.data.aggregate([
  { "$project": {
    "timestamp": {
      "$subtract": [
        { "$divide": [
            { "$subtract": [ "$md", new Date("1970-01-01") ] },
            1000
        ]},
        { "$mod": [
          { "$divide": [
              { "$subtract": [ "$md", new Date("1970-01-01") ] },
              1000
          ]},
          1
        ]}
      ]
    }
  }}
])

Co w ciągu kilku sekund zwraca sygnaturę czasową epoki. Zasadniczo wywodzi się z tego, że jeden obiekt daty BSON jest odejmowany od innego, a wynikiem jest przedział czasu w milisekundach. Użycie początkowej daty epoki „1970-01-01” powoduje zasadniczo wyodrębnienie wartości milisekund z bieżącej wartości daty. $divide operator zasadniczo usuwa część milisekundową i $mod czy modulo implementuje zaokrąglanie.

Naprawdę lepiej, jeśli wykonasz pracę w języku ojczystym swojej aplikacji, ponieważ wszystkie daty BSON zostaną tam zwrócone jako natywny typ „data/data/godzina”, w którym możesz wyodrębnić wartość znacznika czasu. Rozważ podstawy JavaScript w powłoce:

var date = new Date()
( date.valueOf() / 1000 ) - ( ( date.valueOf() / 1000 ) % 1 )

Zazwyczaj przy agregacji chcesz wykonać tego rodzaju „matematykę” na wartości sygnatury czasowej do użycia w czymś takim jak agregowanie wartości w przedziale czasowym, takim jak dzień. W ramach agregacji dostępne są operatory dat, ale można to również zrobić w sposób matematyczny dat:

db.data.aggregate([
    { "$group": {
        "_id": {
          "$subtract": [
              { "$subtract": [ "$md", new Date("1970-01-01") ] },
              { "$mod": [
                  { "$subtract": [ "$md", new Date("1970-01-01") ] },
                  1000 * 60 * 60 * 24
              ]}
          ]
        },
        "count": { "$sum": 1 }
    }}
])

Ta forma byłaby bardziej typowa, gdyby emitowała znacznik czasu zaokrąglony do dnia i agregowała wyniki w tych przedziałach.

Tak więc cel agregacji tylko w celu wyodrębnienia znacznika czasu nie wydaje się najlepszym zastosowaniem lub rzeczywiście nie powinno być konieczne przekonwertowanie tego na sekundy, a nie na milisekundy. Myślę, że powinieneś to robić w kodzie aplikacji, chyba że rzeczywiście chcesz uzyskać wyniki dla przedziałów czasu, w których możesz zastosować matematykę daty, jak pokazano.

Metody są dostępne, ale jeśli faktycznie nie agregujesz, będzie to najgorsza opcja wydajności dla Twojej aplikacji. Zamiast tego wykonaj konwersję w kodzie.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Sprawdź, czy istnieje baza danych mongodb?

  2. Jak ustawić domyślną wartość liczby całkowitej w mongodb?

  3. Wyszukiwanie tekstowe mongodb z wieloma polami

  4. Mangusta nie tworzy indeksów

  5. Jak poprawnie zwiększyć liczbę dat w mongoDB?