在 Golang 中使用 DynamoDB 时,如果呼叫有更多结果,则会设置 在 上,然后您可以将其传递到下一个呼叫,以便从上次中断的地方继续。queryLastEvaluatedKeyQueryOutputqueryExclusiveStartKey
当价值观留在戈朗时,这很有效。但是,我正在编写分页 API 终结点,因此我想序列化此密钥,以便可以将其作为分页令牌交还给客户端。像这样,哪里是神奇的包,它可以做我想做的事:something
type GetDomainObjectsResponse struct {
Items []MyDomainObject `json:"items"`
NextToken string `json:"next_token"`
}
func GetDomainObjects(w http.ResponseWriter, req *http.Request) {
// ... parse query params, set up dynamoIn ...
dynamoIn.ExclusiveStartKey = something.Decode(params.NextToken)
dynamoOut, _ := db.Query(dynamoIn)
response := GetDomainObjectsResponse{}
dynamodbattribute.UnmarshalListOfMaps(dynamoOut.Items, &response.Items)
response.NextToken := something.Encode(dynamoOut.LastEvaluatedKey)
// ... marshal and write the response ...
}
(请原谅上面的任何拼写错误,这是我快速编写的代码的玩具版本,以隔离问题)
由于我需要支持具有不同搜索模式的多个终结点,因此我希望找到一种生成不依赖于特定搜索关键字的分页标记的方法。
麻烦的是,我还没有找到一种干净而通用的方法来序列化.您可以将其直接封送到JSON(然后例如base64编码以获取令牌),但这样做是不可逆的。 是一个 ,并且是一个接口,因此虽然 json 编码器可以读取它,但它无法写入它。LastEvaluatedKeyLastEvaluatedKeymap[string]types.AttributeValuetypes.AttributeValue
例如,以下代码使用 崩溃。panic: json: cannot unmarshal object into Go value of type types.AttributeValue
lastEvaluatedKey := map[string]types.AttributeValue{
"year": &types.AttributeValueMemberN{Value: "1993"},
"title": &types.AttributeValueMemberS{Value: "Benny & Joon"},
}
bytes, err := json.Marshal(lastEvaluatedKey)
if err != nil {
panic(err)
}
decoded := map[string]types.AttributeValue{}
err = json.Unmarshal(bytes, &decoded)
if err != nil {
panic(err)
}
我想要的是一种直接使用迪纳莫DB风格的JSON的方法,就像你在CLI上运行aws动态模型查询时得到的一样。不幸的是,高浪 SDK 不支持此功能。
我想我可以为 AttributeValue 类型编写自己的序列化程序/反序列化程序,但这比这个项目应该付出的努力还要多。
有没有人找到一种通用的方法来做到这一点?
凤凰求蛊
相关分类