我正在構建一個集合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)

開心每一天1111
TA貢獻1836條經驗 獲得超13個贊
將循環修改為此
for _, v := range conditions { collection = collection.Where(v.Field, v.Operator, v.Value) }
- 2 回答
- 0 關注
- 112 瀏覽
添加回答
舉報
0/150
提交
取消