2016-08-08 85 views
1

如果我不使用過濾器,我會得到結果。如果我使用過濾器(這個記錄肯定存在),我沒有得到任何結果。可能缺少爲該屬性定義的索引,但據我所知,應該在開發服務器中自動創建簡單索引(並創建並填充index.yaml文件)。這沒有發生。帶過濾器的AppEngine數據存儲查詢從不返回結果(Go)

query = datastore.NewQuery("UserAccount").Filter("email =", "[email protected]") 

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 := "[email protected]" 

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: [{[email protected]}] 
2016/08/09 02:11:37 DEBUG: Running query. 
2016/08/09 02:11:37 DEBUG: Done. 

瀏覽器的截圖:

Screenshot of Viewer

+0

這是因爲**最終一致性**。查看可能的重複項:1. [如何篩選GAE查詢?](http://stackoverflow.com/questions/29228712/how-to-filter-a-gae-query); 2. [Google App Engine數據存儲 - 測試查詢失敗](http://stackoverflow.com/questions/28590519/google-app-engine-datastore-testing-queries-fails); 3. [爲什麼查詢在沒有提供祖先時沒有返回結果?](http://stackoverflow.com/questions/29529296/why-the-query-doesnt-return-results-when-the-ancestor-未提供) – icza

+0

請確認這是否解決了您的問題。 – icza

+0

@icza它沒有。以前存在的記錄(讀取:在當前開發服務器啓動之前)。它不僅僅是被創造出來的。 –

回答

3

數據存儲中的屬性名稱是"Email"資本E,不"email"

這是區分大小寫的,必須用大寫字母E來查詢:

query = datastore.NewQuery("UserAccount").Filter("Email =", "[email protected]") 

如果你希望它被保存/小e檢索,您可以使用tags進行映射,如:

type UserAccount struct { 
    Email string `datastore:"email"` 
    // other fields... 
} 
+0

感謝您注意到我太愚蠢以至於無法注意到自己。這是一個有趣的三十條消息。至少我們建立了看到「無索引」事物的可能性。此外,我得到了結果,但我仍然沒有看到管理員或「index.yaml」文件中的任何指數。正如DanCornilescu先前所提到的,簡單的索引絕對不能被表示(這似乎會使計算寫入成本估計變得更困難)。最後,我注意到當我在Go(「goapp serve」)下運行我的AppEngine版本時,我收到一個腳註,它說明它封裝了Python Dev服務器。 –

+0

@DustinOprea只有複合索引需要被添加到'index.yaml'。單一房地產指數沒有。單一財產指數以每個實體爲基礎存在:一個實體可能具有索引的Email屬性,另一個可能具有未索引的Email屬性,第三個可能沒有這樣的屬性。即使是第四個也可能有一個,但具有不同的類型...... Datastore不是關係數據庫,它是無模式的。 – icza

+0

@DustinOprea是的,Go SDK使用Python開發服務器,這不是什麼祕密。 – icza

0

爲了能夠通過在時間屬性,屬性必須有索引啓用(在模型中定義)來查找查詢/過濾器的結果的實體創建實體時,以及數據存儲的背景索引任務必須完成。

如果您爲該屬性啓用索引編制該實體已創建,則需要重新編寫該屬性以便觸發索引編制任務,請參閱:https://stackoverflow.com/a/34583510/4495081

「保存搜索索引」消息是在操作發生之前打印的通用消息,但並不表示操作的結果將是非空的。

您不必擔心您的index.yaml文件爲空。並非所有索引都需要存在於index.yaml文件中,只有更復雜/複合的文件需要。您的過濾器可以使用內置索引進行匹配(滿足上述索引要求後)。從Indexes

有兩種類型的索引:

  • 內置指標

    默認情況下,雲存儲自動預先定義爲每個實體類型的每個屬性的索引。這些單一屬性索引是 適合於簡單類型的查詢。

  • 複合索引每索引實體

    複合索引索引多個屬性值。複合索引支持複雜的查詢,並在 中定義了一個索引配置文件(index.yaml)。

+0

目前還不清楚如何爲索引標記屬性或者甚至是否支持。該文檔僅在*阻止索引的情況下提到了標記:(https://cloud.google.com/appengine/docs/go/datastore/indexes)「Age int'datastore:」,noindex「'」 –

+0

確實,在這方面go似乎不同於python。答案仍然適用 - 實體創建時,您可能已禁用索引:) –

+0

@DustinOprea:您可以查看某個媒體資源是否在雲端控制檯數據存儲區查看器中編入索引。找到一個實體並點擊編輯圖標 - 它會顯示所有屬性。 –