在MongoDB的Go驱动mgo(v2)中,聚合查询的动态条件可以通过构建一个[]bson.M切片来实现。bson.M是一个map[string]interface{}类型的别名,用于表示MongoDB的文档。你可以根据不同的条件动态地向这个切片中添加聚合管道阶段。
以下是一个示例,展示了如何实现带有动态条件的聚合查询:
package main
import (
"fmt"
"log"
"gopkg.in/mgo.v2"
"gopkg.in/mgo.v2/bson"
)
func main() {
// 连接到MongoDB
session, err := mgo.Dial("localhost")
if err != nil {
log.Fatal(err)
}
defer session.Close()
// 选择数据库和集合
db := session.DB("testdb")
collection := db.C("testcollection")
// 动态条件
var pipeline []bson.M
// 添加匹配阶段
matchStage := bson.M{
"$match": bson.M{
"status": "active",
},
}
pipeline = append(pipeline, matchStage)
// 添加分组阶段
groupStage := bson.M{
"$group": bson.M{
"_id": "$category",
"total": bson.M{
"$sum": 1,
},
},
}
pipeline = append(pipeline, groupStage)
// 添加排序阶段
sortStage := bson.M{
"$sort": bson.M{
"total": -1,
},
}
pipeline = append(pipeline, sortStage)
// 执行聚合查询
var result []bson.M
err = collection.Pipe(pipeline).All(&result)
if err != nil {
log.Fatal(err)
}
// 输出结果
for _, res := range result {
fmt.Println(res)
}
}
mgo.Dial连接到MongoDB实例。session.DB和db.C选择要操作的数据库和集合。[]bson.M切片pipeline,用于存储聚合管道的各个阶段。pipeline中添加$match、$group和$sort等聚合阶段。collection.Pipe(pipeline).All(&result)执行聚合查询,并将结果存储在result变量中。result并输出查询结果。你可以根据业务逻辑动态地添加或修改pipeline中的阶段。例如,根据用户输入的条件决定是否添加某个匹配阶段,或者根据不同的分组字段进行分组。
mgo v2已经不再维护,建议使用官方的MongoDB Go驱动go.mongodb.org/mongo-driver/mongo,它提供了更现代和更强大的功能。mgo时,确保你的MongoDB版本与驱动兼容。通过这种方式,你可以在mgo v2中实现灵活的、动态条件的聚合查询。