Mongodb 如何使用mgo和Golang编写以下Mongo聚合查询
我有下面的查询,我已经测试并运行了,但是Mongodb 如何使用mgo和Golang编写以下Mongo聚合查询,mongodb,go,aggregation-framework,mgo,mongodb-aggregation,Mongodb,Go,Aggregation Framework,Mgo,Mongodb Aggregation,我有下面的查询,我已经测试并运行了,但是mgo var userId = "57a944390b1acf0d069388c1"; db.users.aggregate([ { "$match": { "_id": userID } }, { "$unwind": "$groups" }, { "$lookup": { "from": "groups", "loc
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",
},