【问题标题】:Unable to get the record based on struct value from datastore using golang无法使用 golang 从数据存储中获取基于结构值的记录
【发布时间】:2018-06-01 16:48:21
【问题描述】:

我正在为搜索功能编写服务。当我在正文中传递值以获取特定记录时,我无法根据结构值获取它。 例如:电话号码或用户名

编辑1:

type PatientData struct {
    ID            int64    datastore:"-"
    FirstName     string   json:"firstname,omitempty"
    LastName      string   json:"lastname,omitempty"
    UserName      string   json:"username,omitempty"
    Phone         string   json:"phone,omitempty"     
}

我想根据用户名或电话获取完整的结构值。以下是我的代码:

func searchValue (res http.ResponseWriter, req *http.Request){

    log.Printf("%#v Getting values url - x ", "called search")

    patient := &PatientData{}
    if err := json.NewDecoder(req.Body).Decode(patient); err != nil {
        panic(err)
    }
    ctx := appengine.NewContext(req)
    ctx, err := appengine.Namespace(ctx, NAMESPACENAME)
    if err != nil {
        panic(err)
    }

    m := patient.Phone
    i, err := strconv.ParseInt(m, 10, 64)
    log.Printf("%#v Getting values m ", m)
    log.Printf("%#v Getting values url -yyy ",i)

    key := datastore.NewKey(ctx, "Patient","" , i, nil)
    log.Printf("%#v Getting values url - key ", key)
    err = datastore.Get(ctx, key, patient)
    if err := json.NewEncoder(res).Encode(patient); err != nil {
        panic(err)
    }

}

当我在我的 Newkey 中传递 PHONE 时,我无法根据 PHONE 生成值

我不想在 put 功能中使用 Newkey 来生成键名,并且基于该 KEYNAME 我不想获取值。

【问题讨论】:

标签: google-app-engine go google-cloud-datastore datastore


【解决方案1】:

datastore.Get() 只能用于通过其密钥从数据存储区获取实体,因此其密钥必须是已知的/存在的。

这显然不是你想要做的。您正在尝试通过不是关键的属性来获取实体。为此,您需要运行 查询

数据存储区查询由datastore.Query 类型表示。您需要创建一个查询并在其上设置过滤器。在您的情况下,您希望按用户名和/或电话属性进行过滤。

这就是它的样子。获取通过电话过滤的患者实体:

q :=  datastore.NewQuery("Patient").Filter("phone =", patient.Phone)

var patients []*Patient
keys, err := q.GetAll(ctx, &patients)
if err != nil {
    // Handle error
    return
}

// patients contains patients with the given phone number

获取按电话号码和用户名过滤的患者的示例:

q :=  datastore.NewQuery("Patient").
    Filter("phone =", patient.Phone).
    Filter("username =", patient.UserName)

var patients []*Patient
keys, err := q.GetAll(ctx, &patients)
if err != nil {
    // Handle error
    return
}

// patients contains patients with the given phone number and username

【讨论】:

  • 感谢您的帮助但我有一个冲突,最终用户应该使用患者的 PHONE 或 FIRSTNAME 或 LASTNAME 进行搜索。你能帮我解决这个问题吗?
  • @SrinathReddy 你的意思是查询中只使用了一个条件,或者一个查询中有多个条件逻辑或连接?
  • 在一个查询中使用逻辑或连接
  • @SrinathReddy 数据存储区查询通常不支持逻辑 OR 连接。我相信添加了一些支持,但它的作用是并行运行多个查询,并合并结果。我不认为 Golang 查询 API 包含这个。最好的办法是自己运行多个查询,然后合并结果。
  • 真的我的问题没有任何解决办法
猜你喜欢
  • 1970-01-01
  • 2018-06-15
  • 1970-01-01
  • 2013-12-01
  • 2015-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多