1 回答
TA贡献1794条经验 获得超7个赞
您的方法有 3 个错误。
首先,find()块集合返回完整文档,而不仅仅是块文档(即block字段)。因此,将结果解组为描述完整文档的类型值,例如:
type Doc struct {
ID primitive.ObjectID `bson:"_id"`
Block Block `bson:"block"`
}
和解组代码:
var doc Doc
if err = results.Decode(&doc); err != nil {
fmt.Println(err)
}
hashHeaders = append(hashHeaders, doc.Block)
其次,transactions是一个数组,所以在 Go 中你必须用一个切片来建模它:
type Block struct {
Transactions []BlockTransaction
}
第三,投影和过滤器中对象数组字段的属性在没有索引的情况下被引用,所以使用投影:
options := options.Find().
SetProjection(bson.M{"block.transactions.transactionHash": 1})
另请注意,您可以使用如下Cursor.All()方法简单地解码结果:
var docs []Doc
err = results.All(ctx, &docs)
if err != nil {
fmt.Println(err)
}
工作完整代码:
func GetBlockTransactions(number int) string {
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
options := options.Find().
SetProjection(bson.M{"block.transactions.transactionHash": 1}).
SetLimit(1)
results, err := blocksCollections.Find(ctx, bson.M{"block.header.blockNumber": strconv.Itoa(number)}, options)
if err != nil {
fmt.Println(err)
}
var docs []Doc
err = results.All(ctx, &docs)
if err != nil {
fmt.Println(err)
}
fmt.Printf("hash: %v\n", docs[0].Block.Transactions[0].TransactionHash)
return string(docs[0].Block.Transactions[0].TransactionHash)
}
还要注意,如果遇到错误,后续代码很可能会失败,所以你应该早点返回。您还应该返回带注释的错误。
像这样:
func GetBlockTransactions(number int) (string, error) {
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
options := options.Find().
SetProjection(bson.M{"block.transactions.transactionHash": 1}).
SetLimit(1)
results, err := blocksCollections.Find(ctx, bson.M{"block.header.blockNumber": strconv.Itoa(number)}, options)
if err != nil {
return "", fmt.Errorf("Find() failed: %w", err)
}
var docs []Doc
err = results.All(ctx, &docs)
if err != nil {
return "", fmt.Errorf("Cursor.All() failed: %w", err)
}
fmt.Printf("hash: %v\n", docs[0].Block.Transactions[0].TransactionHash)
return string(docs[0].Block.Transactions[0].TransactionHash), nil
}
另请注意,如果您只期望一个结果,则更简单的解决方案是使用Collection.FindOne().
- 1 回答
- 0 关注
- 137 浏览
添加回答
举报