Maison  >  Article  >  développement back-end  >  Comment puis-je récupérer le nombre de tous les utilisateurs Linux en sélectionnant des ID de site spécifiques dans MongoDB à l'aide de Go ?

Comment puis-je récupérer le nombre de tous les utilisateurs Linux en sélectionnant des ID de site spécifiques dans MongoDB à l'aide de Go ?

Linda Hamilton
Linda Hamiltonoriginal
2024-10-26 02:27:02541parcourir

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

Récupérer la liste des éléments en vérifiant plusieurs valeurs d'attribut dans MongoDB dans Go

Problème :

Récupérer les éléments sélectionnés en identifiant plusieurs conditions dans MongoDB, analogues à la condition IN dans MySQL :

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

Considérez la structure JSON :

<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>

Tâche : Récupérez le nombre de tous les utilisateurs Linux en sélectionnant les ID de site 'VID1212 ' et 'VID4343'.

Solution :

  1. Utilisez le cadre d'agrégation pour filtrer les documents en fonction des ID de venueList à l'aide de $match.
  2. Découlez les tableaux de sous-documents venueList et sum à l'aide de $unwind.
  3. Filtrez à nouveau à l'aide de $match pour les identifiants souhaités.
  4. Utilisez $group** pour agréger les documents filtrés, en utilisant l'accumulateur **$sum pour les valeurs souhaitées.
  5. Condition utilisant un opérateur ternaire ($cond) pour créer des champs de comptage indépendants.
<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>

Solution alternative :

Pour améliorer les performances et la flexibilité, considérez ce qui suit pipeline alternatif :

<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>

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn