[英]AppEngine Datastore query with filter never returns results (Go)
如果我不使用過濾器,我會得到結果。 如果我使用過濾器(這個記錄肯定存在),我沒有得到任何結果。 可能缺少為該屬性定義的索引,但是,據我所知,應該在開發服務器中自動創建簡單索引(以及使用它創建並填充的index.yaml文件)。 這不會發生。
query = datastore.NewQuery("UserAccount").Filter("email =", "test@example.com")
ua := UserAccount{}
t := query.Run(ctx)
for ; ; {
if _, err = t.Next(&ua); err == nil {
log.Debugf(ctx, "Current: %s", ua)
} else if err == datastore.Done {
break
} else {
panic(err)
}
}
當開發服務器終止時,它聲明它是“保存搜索索引”:
INFO 2016-08-08 05:09:52,894 api_server.py:651] Saving search indexes
但是,由於沒有出現“index.yaml”文件,我假設不需要創建索引,這意味着我的查詢必須沒有達到預期的效果?
我錯過了什么?
編輯:
請注意,之前已創建記錄,並且應用程序自此停止並啟動多次。 我真誠地懷疑這是最終的一致性。
編輯2:
出於測試目的,我使用以下代碼創建了以下模型。 它們都表現出與原始模型和代碼相同的行為。
定義:
type TestEntity struct {
Email string
}
碼:
log.Debugf(ctx, "Putting.")
email := "anothertest@a.b"
te := &TestEntity{
Email: email,
}
k := datastore.NewKey(ctx, "TestEntity", "123", 0, nil)
_, err = datastore.Put(ctx, k, te)
if err != nil {
panic(err)
}
log.Debugf(ctx, "Waiting.")
time.Sleep(1 * time.Second)
query := datastore.NewQuery("TestEntity")
var results []TestEntity
_, err = query.GetAll(ctx, &results)
log.Debugf(ctx, "GetAll: %s", results)
log.Debugf(ctx, "Running query.")
query = datastore.NewQuery("TestEntity").Filter("email =", email)
te = &TestEntity{}
t := query.Run(ctx)
for ; ; {
if _, err = t.Next(te); err == nil {
log.Debugf(ctx, "Found: [%s]", te.Email)
} else if err == datastore.Done {
log.Debugf(ctx, "Done.")
break
} else {
panic(err)
}
}
結果:
2016/08/09 02:11:36 DEBUG: Putting.
2016/08/09 02:11:36 DEBUG: Waiting.
2016/08/09 02:11:37 DEBUG: GetAll: [{anothertest@a.b}]
2016/08/09 02:11:37 DEBUG: Running query.
2016/08/09 02:11:37 DEBUG: Done.
查看器截圖:
數據存儲中的屬性名稱是"Email"
用大寫字母E,而不是"email"
。
它區分大小寫,必須用大寫E查詢:
query = datastore.NewQuery("UserAccount").Filter("Email =", "test@example.com")
如果您希望使用小e
保存/檢索它,您可以使用標簽進行映射,例如:
type UserAccount struct {
Email string `datastore:"email"`
// other fields...
}
為了能夠通過屬性在查詢/過濾器的結果中查找實體,該屬性必須在創建實體時啟用索引(在模型定義中)並且數據存儲區的后台索引任務必須是完成了它。
如果在創建實體后為該屬性啟用索引,則需要重新編寫該屬性以便為其觸發索引任務,請參閱: https : //stackoverflow.com/a/34583510/4495081 。
“保存搜索索引”消息是在操作發生之前打印的通用消息,並不意味着操作的結果將是非空的。
您無需擔心index.yaml
文件為空。 並非所有索引都需要存在於index.yaml
文件中,只需要更復雜/復合的索引。 可以使用內置索引匹配您的過濾器(在滿足上述索引要求之后)。 來自索引 :
有兩種類型的索引:
內置索引
默認情況下,Cloud Datastore會自動為每種實體類型的每個屬性預定義索引。 這些單個屬性索引適用於簡單類型的查詢。
綜合指數
復合索引為每個索引實體索引多個屬性值。 復合索引支持復雜查詢,並在索引配置文件(index.yaml)中定義。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.