TheJediCowboy
TheJediCowboy

Reputation: 9222

How do I write the following Mongo Aggregation Query using mgo with Golang

I have the following query which I have tested and works, but the mgo

var userId = "57a944390b1acf0d069388c1";
db.users.aggregate([
        { "$match": { "_id": userID } },
        { "$unwind": "$groups" },
        {
            "$lookup": {
                "from": "groups",
                "localField": "groups.id",
                "foreignField": "_id",
                "as": "group"
            }
        },
        { "$unwind": "$group" },
        {
            "$project": {
                "group.requests": {
                    "$filter": {
                        "input" : "$group.requests",
                        "as" : "item",
                        "cond": { "$and" : [
                                { "$ne" : ["$$item.user_id", userID] },
                                { "$not" : {
                                        "$setIsSubset" : [
                                            [userID], "$$item.denied_users"
                                        ]
                                    }
                                }
                            ]               
                        }
                    }
                }
            }
        },
        { "$unwind" : "$group.requests" }
      ])

The mgo query looks like the following:

c := session.DB(info.Db()).C("users")

    o1 := bson.M{"$match": bson.M{"_id": userID}}
    o2 := bson.M{"$unwind": "$groups"}
    o3 := bson.M{"$lookup": bson.M{
        "from":         "groups",
        "localField":   "groups.id",
        "foreignField": "_id",
        "as":           "group",
    }}
    o4 := bson.M{"$unwind": "$group"}
    o5 := bson.M{
        "$project": bson.M{
            "group.requests": bson.M{
                "$filter": bson.M{
                    "input": "$group.requests",
                    "as":    "item",
                    "cond": bson.M{
                        "$and": []bson.M{
                            bson.M{"$ne": []string{"$$item.user_id", userID}},
                            bson.M{"$not": bson.M{
                                "$setIsSubset": []interface{}{
                                    []string{userID},
                                    []string{"$$item.denied_users"},
                                },
                            }},
                        },
                    },
                },
            },
        },
    }
    o6 := bson.M{"$unwind": "$group.requests"}
    pipeline := []bson.M{o1, o2, o3, o4, o5, o6}

My guess is that the $filter is not working. Specifically, the way I am specifying the $setIsSubset and arguments to that are not matching the actual mongo query above it. If I remove that section (everything within the $not, then it works (aside from not being the correct filter).

I basically need the top query translated into mgo.

Upvotes: 1

Views: 1003

Answers (1)

CrazyCrow
CrazyCrow

Reputation: 4235

"$setIsSubset": []interface{}{
    []string{userID},
    []string{"$$item.denied_users"},
},

is equal to

"$setIsSubset" : [
    [userID], ["$$item.denied_users"]
]

so I think you need to define it like

"$setIsSubset": []interface{}{
    []string{userID},
    "$$item.denied_users",
},

Upvotes: 1

Related Questions