我一直遇到的麻烦是,只有当令牌不在数组中时,下面的代码才有效(或者被认为是原始刷新令牌,其余的则从中派生)。我浪费了太多宝贵的精力试图找到一种方法来返回正确的会话。
// Find the current sessions info
currentSession := model.Session{}
lookupSession := bson.D{{Key: "token", Value: refreshToken}}
_ := tokensCol.FindOne(ctx, lookupSession).Decode(¤tSession)
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(¤tSession)
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中包含来自对象的特定数据,而不是文档的顶层。因为我不会对此进行检查,因为它是无效的。对此有任何意见或建议吗?
牛魔王的故事
相关分类