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.