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

Получаване на времеви печат на unix за секунди от MongoDB ISODate по време на агрегиране

Не съм сигурен защо смятате, че се нуждаете от стойността в секунди, а не в милисекунди, тъй като обикновено и двете форми са валидни и в повечето езикови реализации милисекундите всъщност са предпочитани. Но най-общо казано, да се опитвате да принудите това в низ е грешен начин да заобиколите това и обикновено просто правите математиката:

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
        ]}
      ]
    }
  }}
])

Което ви връща времева марка за епоха в секунди. По принцип се получава от това, когато един обект за дата на BSON се изважда от друг, тогава резултатът е интервалът от време в милисекунди. Използването на началната дата за епоха "1970-01-01" води до извличане по същество на стойността на милисекунди от стойността на текущата дата. $divide Операторът по същество премахва частта от милисекунди и $mod изпълнява модула за прилагане на закръгляване.

Наистина е по-добре да вършите работата на родния език за вашето приложение, тъй като всички дати на BSON ще бъдат върнати там като роден тип „дата/дата и час“, където можете да извлечете стойността на клеймото за време. Помислете за основите на JavaScript в обвивката:

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

Обикновено с агрегирането искате да направите този вид "математика" на стойност на времеви клей, за използване в нещо като агрегиране на стойности в рамките на период от време, като например ден. Има оператори за дата, достъпни за рамката за агрегиране, но можете да го направите и по математическия начин за дата:

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 }
    }}
])

Тази форма би била по-типична за излъчване на времева марка, закръглена до ден, и обобщаване на резултатите в рамките на тези интервали.

Така че вашето предназначение на рамката за агрегиране само за извличане на времева марка не изглежда най-доброто използване или наистина не трябва да е необходимо да го преобразувате в секунди, а не в милисекунди. В кода на приложението ви е мястото, където според мен трябва да правите това, освен ако, разбира се, всъщност не искате резултати за интервали от време, през които можете да приложите изчисленията на датата, както е показано.

Методите са налице, но освен ако всъщност не агрегирате, това би било най-лошата опция за производителност за вашето приложение. Вместо това направете преобразуването в код.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Конкатениране на низови стойности в масив в едно поле в MongoDB

  2. Как да направя заявка за реферирани обекти в MongoDB?

  3. MongoDB $cond

  4. Преведете Queryable<T> обратно към IMongoQuery

  5. Прегледайте всички колекции на Mongo и изпълнете заявка