Rufen Sie die Anzahl der Elemente für jedes Datum im MongoDB-Aggregat ab

王林
Freigeben: 2024-02-06 10:36:04
nach vorne
398 Leute haben es durchsucht

检索 MongoDB 聚合上每个日期的项目计数

Frageninhalt

Ich habe eine Sammlung mit Ereignissen. Jedes Ereignis verfügt über einen millisekundengenauen Zeitstempel. Ich möchte tägliche Ereignisse gruppieren. Zum Beispiel:

Ich habe

key       value

_id       111222333444555ddd666fff
time      2023-04-23t15:35:19.631z
type      pizza-event

_id       111222333444555ddd666fff
time      2023-04-23t01:41:20.631z
type      tv-event

_id       111222333444555ddd666fff
time      2023-04-22t05:00:05.631z
type      some-event
Nach dem Login kopieren

Das tue ich

key        value

date       04-22-2023
count      1.0

date       04-23-2023
count      2.0
Nach dem Login kopieren

Das ultimative Ziel ist die Verwendung von Abfragen in Golang-Projekten.

Bisher habe ich

[
        {
            "$match" : {
                "$and" : [
                    {
                        "type" : "foo.bar.event"
                    },
                    {
                        "time" : {
                            "$gte" : isodate("2023-04-23t00:00:00.000+0000")
                        }
                    },
                    {
                        "time" : {
                            "$lte" : isodate("2023-04-25t00:00:00.000+0000")
                        }
                    }
                ]
            }
        }, 
        {
            "$group" : {
                "_id" : {
                    "$datetostring" : {
                        "format" : "%m-%d-%y",
                        "date" : "$time"
                    }
                },
                "count" : {
                    "$sum" : 1.0
                }
            }
        }
    ]
Nach dem Login kopieren

Rückkehr

key            value

_id            04-24-2023
count          476.0

_id            04-23-2023
count          28.0
Nach dem Login kopieren

Das sollte funktionieren, aber wenn ich diese Abfrage in meinem Go-Projekt schreibe, erscheint unter „$datetostring“ eine rote, verschnörkelte Linie mit der Meldung „Ungültiger Feldname“, idealerweise hätte ich gerne einen „Uhrzeit“-Schlüssel für das Datum statt „_id“. Als ich während der Gruppenphase folgende Änderungen vorgenommen habe:

{
    _id: null,
    "date": {"$dateToString": { "format": "%m-%d-%Y", "date": "$time"}},
    "count": {"$sum": 1}
}
Nach dem Login kopieren

Ich erhalte die Fehlermeldung „$datetostring“, dass der Gruppenoperator unbekannt ist. Also dachte ich darüber nach, die Gruppe zu erstellen und dann eine Elementstufe für „$datetostring“ hinzuzufügen, aber jetzt gibt die Gruppenstufe die Gruppe jede Millisekunde zurück, was den Zweck der Gruppierung zunichte macht.

Mir ist klar, dass ich zwei verschiedene Themen bespreche. Obwohl jede Hilfe großartig wäre, geht es bei dieser Frage speziell um die Behebung von Mongo-Abfragen. Ich werde bei Bedarf in einem anderen Thread auf die Golang-Codierung zurückkommen. Wenn ich es klarer machen kann, lassen Sie es mich bitte wissen.


Richtige Antwort


Zuallererst: Wenn Sie über eine Anwendungs-Benutzeroberfläche zum Anzeigen der Abfrageergebnisse verfügen, müssen Sie sich nicht um die Formatierung der Ausgabe in der Abfrage kümmern. Dies liegt in der Verantwortung der Anwendungs-UI. Übrigens: Wenn Sie eine App-Benutzeroberfläche haben, sollten Sie die Verwendung von $datetrunc 而不是 $datetostring in Betracht ziehen.

Wie auch immer, in Bezug auf die Anforderungen in Ihrer Frage sollte eine $project Phase wie diese für Sie funktionieren:

[
  {
    "$group": {
      "_id": {
        "$datetostring": { "date": "$time", "format": "%m-%d-%y" }
      },
      "count": { "$sum": 1 }
    }
  },
  { "$project": { "_id": 0, "time": "$_id", "count": "$count" } }
]
Nach dem Login kopieren

Mongodb-Shell-Ausgabe:

{ "time" : "02-08-2020", "count" : 2 }
{ "time" : "05-18-2020", "count" : 2 }
{ "time" : "03-20-2021", "count" : 3 }
{ "time" : "01-11-2021", "count" : 1 }
Nach dem Login kopieren

Zur Verwendung von Abfragen in Go-Projekten finden Sie hier eine Demo:

package main

import (
    "context"
    "fmt"
    "time"

    "go.mongodb.org/mongo-driver/bson"
    "go.mongodb.org/mongo-driver/mongo"
    "go.mongodb.org/mongo-driver/mongo/options"
)

func main() {
    ctx, cancel := context.WithTimeout(context.Background(), 20*time.Second)
    defer cancel()
    client, err := mongo.Connect(ctx, options.Client().ApplyURI("mongodb://localhost:27017"))
    if err != nil {
        panic(err)
    }

    coll := client.Database("baz").Collection("cakeSales")

    matchStage := bson.D{
        {"$match", bson.D{
            {"$and", []bson.D{
                {{"time", bson.D{
                    {"$gte", time.Date(2019, 6, 1, 0, 0, 0, 0, time.UTC)},
                }}},
                {{"time", bson.D{
                    {"$lte", time.Date(2021, 2, 1, 0, 0, 0, 0, time.UTC)},
                }}},
            }},
        }},
    }

    groupStage := bson.D{
        {"$group", bson.D{
            {"_id", bson.D{
                {"$dateToString", bson.D{
                    {"date", "$time"},
                    {"format", "%m-%d-%Y"},
                }},
            }},
            {"count", bson.D{
                {"$sum", 1},
            }},
        }},
    }

    projectStage := bson.D{
        {"$project", bson.D{
            {"_id", 0},
            {"time", "$_id"},
            {"count", "$count"},
        }},
    }

    cursor, err := coll.Aggregate(context.TODO(),
        mongo.Pipeline{matchStage, groupStage, projectStage})
    if err != nil {
        panic(err)
    }

    var results []bson.M
    if err = cursor.All(context.TODO(), &results); err != nil {
        panic(err)
    }
    for _, result := range results {
        fmt.Printf(
            "time: %s count: %v\n",
            result["time"],
            result["count"])
    }
}
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonRufen Sie die Anzahl der Elemente für jedes Datum im MongoDB-Aggregat ab. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!