英文:
How do I write the following Mongo Aggregation Query using mgo with Golang
问题
我有以下查询,我已经测试过并且有效,但是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语法。
英文:
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.
答案1
得分: 1
"$setIsSubset": []interface{}{
[]string{userID},
[]string{"$$item.denied_users"},
},
等同于
"$setIsSubset" : [
[userID], ["$$item.denied_users"]
]
所以我认为你需要这样定义:
"$setIsSubset": []interface{}{
[]string{userID},
"$$item.denied_users",
},
英文:
"$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",
},
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论