首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从Go Mongo返回单个对象

从Go Mongo返回单个对象
EN

Stack Overflow用户
提问于 2022-03-14 03:22:26
回答 1查看 165关注 0票数 1

我一直遇到的问题是,下面的代码只有在令牌不在数组中时才能工作(或者被认为是其他令牌的原始刷新令牌)。我在浪费这么多宝贵的精力,试图找到一种方法来恢复正确的会话。

代码语言:javascript
复制
// Find the current sessions info
currentSession := model.Session{}
lookupSession := bson.D{{Key: "token", Value: refreshToken}}
_ := tokensCol.FindOne(ctx, lookupSession).Decode(&currentSession)
代码语言:javascript
复制
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数组中的对象的一站式商店?下面的代码部分工作,但返回以原始令牌开头的整个文档。不确定如何格式化检索到的数据

代码语言:javascript
复制
currentSession := model.Session{}
filter := bson.M{
    "family": bson.M{
        "$elemMatch": bson.M{"token": refreshToken},
    },
}
_ = tokensCol.FindOne(ctx, filter).Decode(&currentSession)

fmt.Println(currentSession)

返回:

代码语言:javascript
复制
{c8ncjdiaas68dh9fq1d0 eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2NDcyMzcwNjJ9.KlR1mdC0UBnGfxr31MZwzoE7tTVQwuN5uciteSqh8Kg 1 1647237062 false true [{c8ncjhaaas68dh9fq1dg eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2NDcyMzcwNzd9.lx6MIBN_pzlKei9DWr0-k-kvr6yLJ4XfhGSTNNVqRKY 1 1647237077 true false []}]}

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

代码语言:javascript
复制
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返回的文档来包含来自对象的特定数据,而不是文档的顶层数据。因为我不会对它进行检查,因为它将是无效的。对此有何评论或建议?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-03-14 06:46:01

基本上,您想要找到一个有token字段的文档,还是在family数组中有一个具有给定值的token字段的元素?这只是一个$or条件,所以使用这个lookupSession过滤器文档:

代码语言:javascript
复制
lookupSession := bson.M{
    "$or": []bson.M{
        {"token": refreshToken},
        {"family.token": refreshToken},
    },
}

如果不想检索完整的结果文档,请使用投影。有关示例,请参见How to filter fields from a mongo document with the official mongo-go-driver

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71462673

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档