You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在mongo-go-driver中使用聚合选项SetLet?

在Mongo-Go-Driver中正确使用SetLet传递外部变量到聚合管道

你的问题核心在于**$match阶段无法直接引用SetLet定义的变量**——普通的$match查询条件不支持聚合变量语法,必须通过$expr包裹聚合表达式才能访问这些变量。

以下是修正后的完整示例:

package test

import (
    "context"
    "fmt"
    "log"

    "go.mongodb.org/mongo-driver/bson"
    "go.mongodb.org/mongo-driver/mongo"
    "go.mongodb.org/mongo-driver/mongo/options"
)

func test() {
    // 省略数据库连接及集合获取逻辑
    var col *mongo.Collection

    externalId := "test"
    // 定义SetLet变量,bson.M或map[string]interface{}都可以
    let := bson.M{"externalId": externalId}
    aggOpts := options.Aggregate().SetLet(let)

    // 使用$expr包裹表达式,才能在$match中引用$$externalId变量
    aggregation := bson.A{
        bson.D{
            {"$match", bson.D{
                {"$expr", bson.D{
                    {"$eq", bson.A{"$id", "$$externalId"}},
                }},
            }},
        },
    }

    cursor, err := col.Aggregate(context.TODO(), aggregation, aggOpts)
    if err != nil {
        log.Fatal(err)
    }
    defer cursor.Close(context.TODO())

    var result []bson.M
    if err := cursor.All(context.TODO(), &result); err != nil {
        log.Fatal(err)
    }

    fmt.Printf("查询结果: %+v\n", result)
}

关键注意事项:

  • $match中引用变量必须用$expr:普通的查询字段值无法识别$$variable语法,只有聚合表达式(通过$expr启用)才能访问SetLet定义的全局变量。
  • 变量类型匹配:确保SetLet中定义的变量类型与集合中字段的类型一致(比如都是字符串),否则$eq匹配会失败。
  • 错误处理:实际代码中不要忽略Aggregate和cursor操作的错误,便于排查问题。

内容的提问来源于stack exchange,提问作者Tyler

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 12:52:25