Heim > Backend-Entwicklung > Golang > Wie kann ich die Anzahl aller Linux-Benutzer abrufen, indem ich mit Go bestimmte Veranstaltungsort-IDs in MongoDB auswähle?

Wie kann ich die Anzahl aller Linux-Benutzer abrufen, indem ich mit Go bestimmte Veranstaltungsort-IDs in MongoDB auswähle?

Linda Hamilton
Freigeben: 2024-10-26 02:27:02
Original
636 Leute haben es durchsucht

How can I Retrieve the Count of All Linux Users by Selecting Specific Venue IDs in MongoDB using Go?

Elementliste durch Überprüfen mehrerer Attributwerte in MongoDB in Go abrufen

Problem:

Ausgewählte Elemente durch Identifizieren mehrerer abrufen Bedingungen in MongoDB, analog zur IN-Bedingung in MySQL:

<code class="sql">SELECT * FROM venuelist WHERE venueid IN (venueid1, venueid2)</code>
Nach dem Login kopieren

Beachten Sie die JSON-Struktur:

<code class="json">{
  "_id" : ObjectId("57f940c4932a00aba387b0b0"),
  "tenantID" : 1,
  "date" : "2016-10-09 00:23:56",
  "venueList" : [
    {
      "id" : "VID1212",
      "sum" : [
        {
          "name" : "linux",
          "value" : 12
        },
        {
          "name" : "ubuntu",
          "value" : 4
        }
      ],
      "ssidList" : [
        {
          "id" : "SSID1212",
          "sum" : [
            {
              "name" : "linux",
              "value" : 8
            },
            {
              "name" : "ubuntu",
              "value" : 6
            }
          ],
          "macList" : [
            {
              "id" : "12:12:12:12:12:12",
              "sum" : [
                {
                  "name" : "linux",
                  "value" : 12
                },
                {
                  "name" : "ubuntu",
                  "value" : 1
                }
              ]
            }
          ]
        }
      ]
    },
    {
      "id" : "VID4343",
      "sum" : [
        {
          "name" : "linux",
          "value" : 2
        }
      ],
      "ssidList" : [
        {
          "id" : "SSID4343",
          "sum" : [
            {
              "name" : "linux",
              "value" : 2
            }
          ],
          "macList" : [
            {
              "id" : "43:43:43:43:43:34",
              "sum" : [
                {
                  "name" : "linux",
                  "value" : 2
                }
              ]
            }
          ]
        }
      ]
    }
  ]
}</code>
Nach dem Login kopieren

Aufgabe: Rufen Sie die Anzahl aller Linux-Benutzer ab, indem Sie die Veranstaltungsort-IDs „VID1212“ auswählen ' und 'VID4343'.

Lösung:

  1. Verwenden Sie das Aggregationsframework, um Dokumente basierend auf VenueList-IDs mit $match zu filtern.
  2. Entwickeln Sie venueList und sum Unterdokumentarrays mit $unwind.
  3. Erneut filtern mit $match für gewünschte IDs.
  4. Verwenden Sie $group**, um gefilterte Dokumente zu aggregieren, und verwenden Sie den Akkumulator **$sum für gewünschte Werte.
  5. Bedingung mit einem ternären Operator ($cond), um unabhängige Zählfelder zu erstellen.
<code class="go">// Import the necessary packages.
import (
    "context"
    "fmt"

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

// retrieveItemListByAttributeValues retrieves items based on multiple attribute values in MongoDB.
func retrieveItemListByAttributeValues(client *mongo.Client) {
    // Create a new context.
    ctx := context.Background()

    // Define the pipeline.
    pipeline := mongo.Pipeline{
        {{"$match", bson.D{{"venueList.id", bson.D{{"$in", bson.A{"VID1212", "VID4343"}}}}}}},
        {{"$unwind", "$venueList"}},
        {{"$match", bson.D{{"venueList.id", bson.D{{"$in", bson.A{"VID1212", "VID4343"}}}}}}},
        {{"$unwind", "$venueList.sum"}},
        {
            {"$group", bson.D{
                {"_id", nil},
                {"linux", bson.D{{"$sum", bson.M{"$cond", bson.A{bson.VC.Bool(true), "$venueList.sum.value", 0}}}}}},
                {"ubuntu", bson.D{{"$sum", bson.M{"$cond", bson.A{bson.VC.Bool(true), "$venueList.sum.value", 0}}}}}},
            }},
        },
    }

    // Execute the aggregation pipeline.
    aggRes, err := client.Database("test").Collection("venuelist").Aggregate(ctx, pipeline)
    if err != nil {
        panic(err)
    }

    // Iterate over the results.
    for aggRes.Next(ctx) {
        var result bson.M
        if err := aggRes.Decode(&result); err != nil {
            panic(err)
        }

        // Print the result.
        fmt.Println(result)
    }

    // Close the cursor.
    if err := aggRes.Close(ctx); err != nil {
        panic(err)
    }
}</code>
Nach dem Login kopieren

Alternative Lösung:

Für eine verbesserte Leistung und Flexibilität sollten Sie Folgendes berücksichtigen alternative Pipeline:

<code class="go">pipeline := mongo.Pipeline{
    {{"$match", bson.D{{"venueList.id", bson.D{{"$in", bson.A{"VID1212", "VID4343"}}}}}}},
    {{"$unwind", "$venueList"}},
    {{"$match", bson.D{{"venueList.id", bson.D{{"$in", bson.A{"VID1212", "VID4343"}}}}}}},
    {{"$unwind", "$venueList.sum"}},
    {
        {"$group", bson.D{
            {"_id", "$venueList.sum.name"},
            {"count", bson.D{{"$sum", "$venueList.sum.value"}}},
        }},
    },
    {
        {"$group", bson.D{
            {"_id", nil},
            {"counts", bson.D{{"$push", bson.D{
                {"name", "$_id"},
                {"count", "$count"},
            }}}},
        }},
    },
}</code>
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWie kann ich die Anzahl aller Linux-Benutzer abrufen, indem ich mit Go bestimmte Veranstaltungsort-IDs in MongoDB auswähle?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage