Используя библиотеку Golang Firestore 1.8, я пытаюсь использовать новые функции count(), представленные Google Firestore прошлой осенью. В документах, похоже, еще нет примеров, не то, что я нашел, но я собрал несколько работоспособный фрагмент кода, который помогает мне почти полностью, за исключением фактического создания целого числа. Значение «result[userCountAlias]» в нижней части этого фрагмента — это то, что мне нужно преобразовать в целое число, и я не совсем уверен, как это сделать. Я мог бы, конечно, взять его как строку, разделить на двоеточие, а затем разобрать, но это выглядит некрасиво.
Любые подсказки будут высоко оценены!
Большое спасибо.
func (s UserService) Count(labID string) (int64, error) {
if s.DB == nil {
return -1, customerrors.ErrDatabaseMissing
}
query := s.DB.
Collection(CollectionUsers).
Where("lab_id", "= = ", labID)
userCountAlias := "userCount"
ag := query.NewAggregationQuery()
//result is a firestore.AggregationResult, which seems to consist of just a
//map[string]interface{}
result, err := ag.WithCount(userCountAlias).Get(s.Ctx)
if err != nil {
return -1, err
}
v := result[userCountAlias]//How do I cast this to an integer?
fmt.Printf("Type = %v", v) //Prints "Type = integer_value:379"
return -1, nil
}
Попробуйте fmt.Printf("Type = %T", v)
узнать тип v
.
v
, скорее всего, имеет тип firestorepb.Value. Обратите внимание, что это пока недоступно в версии 1.8. Попробуйте обновить cloud.google.com/go/firestore
до последней версии (на данный момент это 1.9).
package main
import (
"fmt"
"cloud.google.com/go/firestore/apiv1/firestorepb"
)
func main() {
var v interface{} = &firestorepb.Value{
ValueType: &firestorepb.Value_IntegerValue{
IntegerValue: 379,
},
}
fmt.Printf("%T\n", v) // *firestorepb.Value
fmt.Printf("%v\n", v) // integer_value:379
if v, ok := v.(*firestorepb.Value); ok {
fmt.Printf("%v\n", v.GetIntegerValue()) // 379
}
}
Тест в официальном репозитории извлекает значение таким же образом. См. TestIntegration_CountAggregationQuery.
Спасибо! Приведение v к *firestorepb.Value вместе с вызовом v.GetIntegerValue() абсолютно помогло.