亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Golang 中的 Firestore 動態復合查詢

Golang 中的 Firestore 動態復合查詢

Go
弒天下 2022-08-30 15:03:36
我正在構建一個集合API,它將返回firestore的文檔集合列表,其中可以發送動態查詢,如下所示GETClient sidetype Condition struct {  Field    string  Operator string  Value    interface{}}// Client side conditions := []*Condition{    {Field: "email", Operator: "==", Value:"some@email"},    {Field: "fullname", Operator: "==", Value: "somename"},}docs := Get("user", conditions)// do something with docs    // Server sidefunc Get(cn string, conditions []*Condition) *firestore.DocumentIterator {  collection := firestoreClient.Collection(cn)  for _, v := range conditions {    collection.Where(v.Field, v.Operator, v.Value)  }  return collection.Documents(ctx)}這返回沒有錯誤,但是它不是返回具有匹配條件的文檔,而是只返回集合中的所有內容,當然我可以像這樣做....cn := "user"collection := client.Collection(cn)collection.  Where("email", "==", "some@email").  Where("fullname", "==", "somename").  //chain some other Where condition我已經在任何地方搜索過,但提供的解決方案是通過手動鏈接如上所述的方法,這并不理想,因為將控制查詢。我不想為每個可能的查詢組合創建一個函數,我也不認為這是最好的方法。WhereClient side如何在Golang Firestore中實現這一點?更新接受的答案正在工作,但是它不會檢查客戶端是否沒有發送任何內容,它將觸發.所以我添加了一些檢查,以防萬一有人偶然發現同樣的問題where conditionsnull pointer errortype FirestoreConditions struct {    Field    string    Operator string    Value    interface{}}// conditions []*FirestoreConditionsvar q firestore.Queryif len(conditions) > 0 {    for i, v := range conditions {        if i == 0 {            q = collection.Where(v.Field, v.Operator, v.Value)            continue        }        q = q.Where(v.Field, v.Operator, v.Value)    }    q = q.OrderBy(query.OrderBy, sort).Limit(int(query.Limit)).Offset(int(query.Offset))} else {    q = collection.OrderBy(query.OrderBy, sort).Limit(int(query.Limit)).Offset(int(query.Offset))}
查看完整描述

2 回答

?
呼啦一陣風

TA貢獻1802條經驗 獲得超6個贊

您需要定義返回值的變量類型。從集合中為數組中的第一個數據創建查詢,然后為下一個數據追加查詢


var q firestore.Query


for i, v := range conditions {

    if i == 0 {

        q = collection.Where(v.Field, v.Operator, v.Value)

    } else {

        q = q.Where(v.Field, v.Operator, v.Value)

    }

}

通過引用該查詢獲取結果


iter := q.Documents(ctx)


查看完整回答
反對 回復 2022-08-30
?
開心每一天1111

TA貢獻1836條經驗 獲得超13個贊

將循環修改為此

for _, v := range conditions {
    collection = collection.Where(v.Field, v.Operator, v.Value)
}


查看完整回答
反對 回復 2022-08-30
  • 2 回答
  • 0 關注
  • 112 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號