0

Ich habe ein paar Elemente, von denen ein Feld ein UTC-basierter Unix-Zeitstempel multipliziert mit 1000 ist, um Millisekunden einzuschließen, während es einen long (Integer) Wert behält.Offset-Wert vor der Gruppierung

{ 
    "title" : "Merkel 'explains' refugee convention to Trump in phone call", 
    "iso" : "2017-01-31T04:03:53.807+0000", 
    "id" : NumberLong(1485835433807) 
} 
{ 
    "title" : "NASA to Explore an Asteroid Containing Enough Mineral Wealth to Collapse the World Economy", 
    "iso" : "2017-01-30T23:20:27.327+0000", 
    "id" : NumberLong(1485818427327) 
} 
{ 
    "title" : "IMGKit: Python library of HTML to IMG wrapper", 
    "iso" : "2017-01-30T23:15:39.488+0000", 
    "id" : NumberLong(1485818139488) 
} 

das iso Feld ist nur eine Textzeichenfolge das Debuggen zu erleichtern, es hat keinen anderen Zweck.

Ich beabsichtige, die in https://stackoverflow.com/a/26550803/277267 beschriebene Methode zu verwenden, um die Elemente neu zu berechnen, um eine Zusammenfassung der Elemente pro Tag zu erstellen, anfänglich nur eine Zählung wenn Elemente pro Tag.

Das Problem ist, dass der Zeitstempel (das Feld "id") nicht wirklich verwendet werden kann, um dies zu erreichen, wegen der UTC-Offset. Abhängig von der Position des Benutzers (oder der lokalen Einfügungszeit, dh 00:30 Uhr Ortszeit vs. 23:30 Uhr Sonntag UTC Zeit, wenn die Zeitzone + 1h ist) würde ein Element entweder zu einem Tag oder dem anderen gehören, so dass der Feld fehlt diese Information.

Angenommen, ich möchte nur ein auf das von 3600000, "id" Feld, dh Offset hinzufügen, die in Millisekunden eine Stunde, bevor die Daten auf das "id" Feld basierend auf sampeln beginnen, wie kann ich archieve dies in der Aggregation Pipeline ?

Gibt es eine Möglichkeit, eine erste Stufe zu haben, die den Feldwert "id" annimmt, diesen Wert 3600000 hinzufügt und in einem Feld "id_offsetted" speichert, auf dem ich dann die nächsten Stufen ausführen kann?

+0

Ich folge nicht Ihre Argumentation Datum als numberlong hinter speichern, weil das Datum Objekt präzise genug ist Millisekunden aufzunehmen. –

+0

Dies dient zur Lösung von Leistungsproblemen auf den Clients (Java und JavaScript). Ich beschäftige mich mit 10 von 1000 von Artikeln pro Abruf, Sekunden der Wartezeit für den Benutzer sind von Bedeutung. Außerdem ist das "id" -Feld ein eindeutiger, abspeicherbarer, sortierbarer und indizierbarer Schlüssel (für jeden Benutzer). –

+0

Wahrscheinlich ist Ihr Grund, 10.000 + Dokumente in den Speicher zu laden, nicht gut. Die Arbeit, die Ihr Java/JavaScript mit diesen Datensätzen zu tun versucht, sollte in den Abfragen ausgeführt werden. –

Antwort

1

Version vor 3,4

{$project: { 
     "title" : 1, 
     "iso" : 1 
     "id" : 1, 
     "id_offsetted" : {$add: ["$id", 3600000]} 
    } } 

Version 3.4 ab

{$addFields: { 
     "id_offsetted" : {$add: ["$id", 3600000]} 
    } } 
Verwandte Themen