I know KeysOnly queries are cheaper, but I'm wondering if I'm implementing it correctly.
For instance, if I make a GetAll func for KeysOnly (like the one below), should I still initialize the users struct ([]User)?
func GetAllUserKeysByFilter(ctx context.Context, filters ...UserFilter) ([]*datastore.Key, error) {
var users []User
query := datastore.NewQuery("User").KeysOnly()
for _, filter := range filters {
if filter.Age != 0 {
query = query.Filter("Age =", filter.Age)
}
if filter.Limit != 0 {
query = query.Limit(filter.Limit)
}
}
keys, err := DatastoreClient().GetAll(ctx, query, &users)
if err != nil {
return nil, err
}
return keys, nil
}
Moreover, what if I only want to get key of a direct call (where I already know the namekey - in this case, namekey == username) for the purpose of checking if this key exists or not, then what's the right way to do it?
Right now I do like this:
func GetUserByNameKey(ctx context.Context, key *datastore.Key) (User, error) {
var user User
err := DatastoreClient().Get(ctx, key, &user)
if err != nil {
return user, err
}
return user, nil
}
But can it be converted somehow to become cheaper since I only care about finding out if the User key exists or not?
Maybe it would be cheaper to use the GetAllUserKeysByFilter with Limit == 1?