我有以下查询,我已经测试和工作,但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" }
])
mgo
查询如下:
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}
我的猜测是$filter
不工作。具体来说,我指定$setIsSubset
的方式及其参数与上面的实际mongo查询不匹配。如果我删除该部分($not
中的所有内容),则它可以工作(除了不是正确的过滤器)。
我基本上需要把上面的查询翻译成mgo。
"$setIsSubset": []interface{}{
[]string{userID},
[]string{"$$item.denied_users"},
},
等于
"$setIsSubset" : [
[userID], ["$$item.denied_users"]
]
所以我认为你需要定义它为
"$setIsSubset": []interface{}{
[]string{userID},
"$$item.denied_users",
},