如何使用mgo和Golang编写以下Mongo聚合查询:

huangapple go评论66阅读模式
英文:

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",
},

huangapple
  • 本文由 发表于 2016年8月20日 12:32:16
  • 转载请务必保留本文链接:https://go.coder-hub.com/39050499.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定