Home  >  Article  >  Backend Development  >  How to Retrieve Items Based on Multiple Attribute Values in MongoDB Using Go?

How to Retrieve Items Based on Multiple Attribute Values in MongoDB Using Go?

DDD
DDDOriginal
2024-10-26 01:31:28386browse

How to Retrieve Items Based on Multiple Attribute Values in MongoDB Using Go?

Retrieve Item List by Checking Multiple Attribute Values in MongoDB in Go

In MongoDB, retrieving items based on multiple attribute values can be achieved using the aggregation pipeline. Here's a Go implementation using the mgo.v2 package:

<code class="go">import (
    "context"
    "fmt"
    "gopkg.in/mgo.v2"
    "gopkg.in/mgo.v2/bson"
)

func RetrieveItemListByMultipleAttributeValues(databaseName, collectionName string, venueIDs []string) (map[string]int, error) {
    ctx := context.Background()

    // Create a new MongoDB connection.
    session, err := mgo.Dial("mongodb://host:port")
    if err != nil {
        return nil, fmt.Errorf("Error dialing MongoDB: %w", err)
    }
    defer session.Close()

    // Select the database and collection.
    collection := session.DB(databaseName).C(collectionName)

    // Define the aggregation pipeline.
    pipeline := []bson.M{
        {"$match": bson.M{"venueList.id": bson.M{"$in": venueIDs}}},
        {"$unwind": "$venueList"},
        {"$match": bson.M{"venueList.id": bson.M{"$in": venueIDs}}},
        {"$unwind": "$venueList.sum"},
        {"$group": bson.M{
            "_id": "$venueList.sum.name",
            "count": bson.M{"$sum": "$venueList.sum.value"},
        }},
        {"$group": bson.M{
            "_id": nil,
            "counts": bson.M{
                "$push": bson.M{
                    "name": "$_id",
                    "count": "$count",
                },
            },
        }},
    }

    // Run the aggregation pipeline.
    resultIterator, err := collection.Pipe(pipeline).Iter()
    if err != nil {
        return nil, fmt.Errorf("Error running aggregation pipeline: %w", err)
    }

    // Create a map to store the aggregated results.
    result := make(map[string]int)

    // Decode each result and add it to the map.
    for resultIterator.Next(&result) {
        for _, count := range result["counts"].([]interface{}) {
            result[count.(map[string]interface{})["name"].(string)] = count.(map[string]interface{})["count"].(int)
        }
    }

    // Close the result iterator.
    resultIterator.Close()

    // Return the result map.
    return result, nil
}</code>

The above is the detailed content of How to Retrieve Items Based on Multiple Attribute Values in MongoDB Using Go?. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn