ホームページ > バックエンド開発 > Golang > Go を使用して MongoDB で特定の Venue ID を選択して、すべての Linux ユーザーの数を取得するにはどうすればよいですか?

Go を使用して MongoDB で特定の Venue ID を選択して、すべての Linux ユーザーの数を取得するにはどうすればよいですか?

Linda Hamilton
リリース: 2024-10-26 02:27:02
オリジナル
637 人が閲覧しました

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

Go の MongoDB の複数の属性値を確認して項目リストを取得する

問題:

複数の属性値を識別して選択された項目を取得するMySQL の IN 条件に類似した MongoDB の条件:

<code class="sql">SELECT * FROM venuelist WHERE venueid IN (venueid1, venueid2)</code>
ログイン後にコピー

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>
ログイン後にコピー

タスク: 会場 ID 'VID1212 を選択して、すべての Linux ユーザーの数を取得します。 ' および 'VID4343'。

解決策:

  1. 集約フレームワークを使用し、$match を使用して、venueList ID に基づいてドキュメントをフィルターします。
  2. $unwindを使用して、venueListsumのサブドキュメント配列をアンワインドします。
  3. $match 必要な ID を指定します。
  4. フィルタリングされたドキュメントを集計するには、
  5. $group** を使用し、必要な値には **$sum アキュムレータを使用します。
  6. 三項演算子を使用した条件 (
  7. $cond) を使用して、独立したカウント フィールドを作成します。
<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>
ログイン後にコピー

代替解決策:

パフォーマンスと柔軟性を向上させるには、次のことを考慮してください。代替パイプライン:

以上がGo を使用して MongoDB で特定の Venue ID を選択して、すべての Linux ユーザーの数を取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート