du4822 2016-08-20 04:32
浏览 221
已采纳

如何在Golang中使用mgo编写以下Mongo聚合查询

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条回答 默认 最新

  • doukengzi3517 2016-08-20 04:56
    关注
    "$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",
    },
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 如何让企业微信机器人实现消息汇总整合
  • ¥50 关于#ui#的问题:做yolov8的ui界面出现的问题
  • ¥15 如何用Python爬取各高校教师公开的教育和工作经历
  • ¥15 TLE9879QXA40 电机驱动
  • ¥20 对于工程问题的非线性数学模型进行线性化
  • ¥15 Mirare PLUS 进行密钥认证?(详解)
  • ¥15 物体双站RCS和其组成阵列后的双站RCS关系验证
  • ¥20 想用ollama做一个自己的AI数据库
  • ¥15 关于qualoth编辑及缝合服装领子的问题解决方案探寻
  • ¥15 请问怎么才能复现这样的图呀