如何使用带有Golang的mgo编写以下Mongo聚合查询

时间:2016-08-20 04:32:17

标签: mongodb go aggregation-framework mgo mongodb-aggregation

我有以下查询,我已经测试并运行,但是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。

1 个答案:

答案 0 :(得分:1)

"$setIsSubset": []interface{}{
    []string{userID},
    []string{"$$item.denied_users"},
},

等于

"$setIsSubset" : [
    [userID], ["$$item.denied_users"]
]

所以我认为你需要像

那样定义它
"$setIsSubset": []interface{}{
    []string{userID},
    "$$item.denied_users",
},