我一直遇到的麻煩是,只有當令牌不在數組中時,下面的代碼才有效(或者被認為是原始刷新令牌,其余的則從中派生)。我浪費了太多寶貴的精力試圖找到一種方法來返回正確的會話。// Find the current sessions infocurrentSession := 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: 1647230152valid: falseoriginal: truefamily: 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": refreshTokensession := 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貢獻1830條經驗 獲得超3個贊
所以基本上你想找到一個文檔,它有一個token字段或family數組中的一個元素有token一個給定值的字段?這只是一個$or條件,因此請使用此lookupSession過濾器文檔:
lookupSession := bson.M{
"$or": []bson.M{
{"token": refreshToken},
{"family.token": refreshToken},
},
}
如果您不想檢索完整的結果文檔,請使用投影。有關示例,請參閱如何使用官方 mongo-go-driver 從 mongo 文檔中過濾字段
- 1 回答
- 0 關注
- 90 瀏覽
添加回答
舉報
0/150
提交
取消