簡體   English   中英

帶過濾器的AppEngine數據存儲區查詢永遠不會返回結果(Go)

[英]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.

查看器截圖:

Viewer的截圖

數據存儲中的屬性名稱是"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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM