为了账号安全,请及时绑定邮箱和手机立即绑定

从 Go Mongo API 返回单个对象

从 Go Mongo API 返回单个对象

Go
撒科打诨 2022-11-23 13:59:38

我一直遇到的麻烦是,只有当令牌不在数组中时,下面的代码才有效(或者被认为是原始刷新令牌,其余的则从中派生)。我浪费了太多宝贵的精力试图找到一种方法来返回正确的会话。


// Find the current sessions info

currentSession := model.Session{}

lookupSession := bson.D{{Key: "token", Value: refreshToken}}

_ := tokensCol.FindOne(ctx, lookupSession).Decode(&currentSession)

token: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2NDcyMzAxNTJ9.R-Tm8sgs..."

userID: "1"

userAgent: ""

ip: ""

exp: 1647230152

valid: false

original: true

family:

   0:

      token: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2NDcyMzAyNTJ9.noqkeUYW..."

      userID: "1"

      userAgent: ""

      ip: ""

      exp: 1647230252

      valid: true

      original: false

是否有一个一站式商店可以返回令牌驻留在文档顶层或嵌套在family数组中的对象?下面的代码部分有效,但返回以原始标记开头的整个文档。不确定如何调整检索到的数据


currentSession := model.Session{}

filter := bson.M{

    "family": bson.M{

        "$elemMatch": bson.M{"token": refreshToken},

    },

}

_ = tokensCol.FindOne(ctx, filter).Decode(&currentSession)


fmt.Println(currentSession)

退货:


{c8ncjdiaas68dh9fq1d0 eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2NDcyMzcwNjJ9.KlR1mdC0UBnGfxr31MZwzoE7tTVQwuN5uciteSqh8Kg 1 1647237062 false true [{c8ncjhaaas68dh9fq1dg eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2NDcyMzcwNzd9.lx6MIBN_pzlKei9DWr0-k-kvr6yLJ4XfhGSTNNVqRKY 1 1647237077 true false []}]}

编辑:很好,但是......我仍然只返回文档顶部的原始标记,而不是我需要的嵌套对象?唯一的区别是令牌的值正确返回而不是 throwing "token": 1,我说"token": refreshToken


session := model.Session{}

lookupSession := bson.M{

    "$or": []bson.M{

        {"token": refreshToken},

        {"family.token": refreshToken},

    },

}

opts := options.FindOne().SetProjection(

    bson.M{

        "token":     refreshToken,

        "userid":    1,

        "useragent": 1,

        "ip":        1,

        "exp":       1,

        "valid":     1,

        "original":  1,

    },

)

lookupErr := tokensCol.FindOne(ctx, lookupSession, opts).Decode(&session)

我真的需要从返回的文档FindOne中包含来自对象的特定数据,而不是文档的顶层。因为我不会对此进行检查,因为它是无效的。对此有任何意见或建议吗?


查看完整描述

1 回答

?
牛魔王的故事

TA贡献1544条经验 获得超3个赞

所以基本上你想找到一个文档,它有一个token字段或family数组中的一个元素有token一个给定值的字段?这只是一个$or条件,因此请使用此lookupSession过滤器文档:


lookupSession := bson.M{

    "$or": []bson.M{

        {"token": refreshToken},

        {"family.token": refreshToken},

    },

}

如果您不想检索完整的结果文档,请使用投影。有关示例,请参阅如何使用官方 mongo-go-driver 从 mongo 文档中过滤字段


查看完整回答
反对 回复 2022-11-23

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信