猿问

带有 $setIntersection 的 Mongodb 聚合管道

我目前正在使用 golang 创建一个聚合管道,在该管道中我使用“$or”运算符查询文档。


结果是一堆未分组的文档,我需要对它们进行分组,以便我可以进入下一个阶段,找到两个数据集之间的交集。然后用于在单独的集合中进行查找


{

                "$match": bson.M{

                    "userID": bson.M{"$lt": afterID},

                    "$or": []bson.M{

                        // "follower": myID,

                        {"follower": myID},

                        {"follower": personID},

                    },

                },

            },

            {

                "$group": bson.M{

                    "_id":       "$follower",

                    "followers": bson.M{"$push": "$userID"},

                },

            },

            {

                "$project": bson.M{

                    "common": bson.M{"$setIntersection": []interface{}{string("$" + myID.Hex() + ".followers"), string("$" + personID.Hex() + ".followers")}},

                },

            },

}

问题是,在“项目”阶段,我需要以某种方式引用 ID,尽管在进行查询之前就知道这些 ID,但不能用它们的字符串表示形式替换它们。


我知道这一点,因为尽管具有共同的值,但该值始终解析为 null。


我怎样才能实现这一点,或者甚至以一种简单的方式对我的查询进行建模,而无需对查询进行分块并手动查找交集?


一只萌萌小番薯
浏览 224回答 1
1回答

一只斗牛犬

在该$group阶段之后,将有 2 个文档在管道中,一个带有_id:myId和一个带有_id:personID.该$project阶段一次对单个文档进行操作,并且无法引用其他文档中的字段。为了同时看到两者,使用第二组阶段并将两个跟随者数组推入一个数组数组,然后您可以让项目阶段获得组合数组的前两个元素的交集。            {                "$group": bson.M{                    "_id":       "$follower",                    "followers": bson.M{"$push": "$userID"},                },            },            {                "$group": bson.M{                    "_id":       null,                    "combined": bson.M{"$push": "$followers"},                },            },            {                "$project": bson.M{                    "common": bson.M{"$setIntersection": []interface{}{                       bson.M{"$arrayElemAt":[]interface{}{"$combined",0},                       bson.M{"$arrayElemAt":[]interface{}{"$combined",1}                    }},                },            },
随时随地看视频慕课网APP

相关分类

Go
我要回答