从 Go 返回单个对象 Mongo API

Returning a single object from Go Mongo API

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

// 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

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

currentSession := model.Session{}
filter := bson.M{
    "family": bson.M{
        "$elemMatch": bson.M{"token": refreshToken},
    },
}
_ = tokensCol.FindOne(ctx, filter).Decode(&currentSession)

fmt.Println(currentSession)

Returns:

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

编辑:很好,但是..我仍然只是return文档顶部的原始标记,而不是我需要的嵌套对象?唯一的区别是令牌 return 的值是正确的,而不是抛出 "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 的 returned 文档来包含对象中的特定数据,而不是文档的顶级数据。因为我不会 运行 检查它,因为它是无效的。对此有什么意见或建议吗??

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

lookupSession := bson.M{
    "$or": []bson.M{
        {"token": refreshToken},
        {"family.token": refreshToken},
    },
}

如果您不想检索完整的结果文档,请使用投影。有关示例,请参阅