mongodb - 我可以使用 golang (mgo) 在一个查询中聚合两个 mongodb 查询吗?

标签 mongodb go aggregation-framework mgo mongodb-aggregation

我用的是golangmgomongodb版本是3.2.9

For example i have two documents in one collection:

{"groupId" : 4, "name" : "email", "value" : "11@11.com"}

{"groupId" : 4,"name" : "phoneNumber","value" : "000000000"}

我知道 phoneNumber(值和名称),我需要找到电子邮件(值)。 它可以通过两个查询简单地完成:首先通过 phoneNumber 我找到了 groupId 然后通过 groupId 我找到了电子邮件。 是否可以在一个查询中完成(使用 golang 和 mgo)?

最佳答案

是的,您需要运行以下形式的聚合管道:

var pipeline = [    
    {
        "$group": {
            "_id": "$groupId",
            "entries": {
                "$push": {
                    "name": "$name",
                    "value": "$value"
                }
            }
        }
    },
    {
        "$match": {
            "entries.name" : "phoneNumber", 
            "entries.value" : "000000000"
        }
    },
    {
        "$project": {
            "item": {
                "$arrayElemAt": [
                    {
                        "$filter": {
                            "input": "$entries",
                            "as": "item",
                            "cond": { "$eq": [ "$$item.name", "email" ] }
                        }
                    }, 0
                ]
            }
        }
    },
    {
        "$project": {
            "_id": 0,
            "email": "$item.value"
        }
    }

]);
db.collection.aggregate(pipeline);

示例输出

{ "email" : "11@11.com" }

其中等效的 mGo 表达式如下(未经测试):

pipeline := []bson.D{   
    bson.M{
        "$group": bson.M{
            "_id": "$groupId",
            "entries": bson.M{
                "$push": bson.M{
                    "name": "$name",
                    "value": "$value"
                }
            }
        }
    },
    bson.M{
        "$match": bson.M{
            "entries.name" : "phoneNumber", 
            "entries.value" : "000000000"
        }
    },
    bson.M{
        "$project": bson.M{
            "item": bson.M{
                "$arrayElemAt": [
                    bson.M{
                        "$filter": bson.M{
                            "input": "$entries",
                            "as": "item",
                            "cond": bson.M{ "$eq": 
                                []interface{}{  "$$item.name", "email" }    
                            }
                        }
                    }, 0
                ]
            }
        }
    },
    bson.M{
        "$project": bson.M{
            "_id": 0,
            "email": "$item.value"
        }
    }
}

pipe := collection.Pipe(pipeline)
iter := pipe.Iter()

关于mongodb - 我可以使用 golang (mgo) 在一个查询中聚合两个 mongodb 查询吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39747073/

相关文章:

node.js - 从图表路由到 bar1 页面时出现 404 错误

node.js - 使用 Mongoose 访问数组数组中的对象

regex - 如何将正则表达式应用于文件中的内容(Go)?

go - 加入或推送 slice

go - 如何让函数支持一个或两个返回值

javascript - Mongodb 聚合 - 今天按小时分组

node.js - Mongo聚合忽略$match中的日期范围过滤器

python - 如何从 python 中使用 mongolab 附加组件到 Heroku?

javascript - 需要帮助理解 mongodb 聚合 $cond 的 for 循环

mongoDB 如何杀死/终止 map_reduce 作业?