2017-03-20 37 views
1

比方說,我有一個父/子關係模型與2谷歌數據存儲類型。如何解決Google數據存儲n + 1查詢問題?

如果我使用父鍵查詢子表,有沒有辦法從父表中檢索字段而不必執行n + 1查詢?上述

RequestLedger 
key | type | content | sentTimestamp 
123 email <ssd>  10-10-10 


ResultLedger 
key    | requestLedger   |to   | deliveredTimestamp | bouncedTimestamp | other 
[email protected]  key(request_ledger,123) [email protected]  10-10-10 

代碼

var query = ds.createQuery(env.get('GCLOUD_DATASTORE_NAMESPACE'), resultLedgerKind) 
.offset(offset) 
.limit(max); 

if(parentId){ 
    query = query.filter('requestLedger', ds.key([requestLedgerKind, parentId])); 

} 


query.run(function(err, entities) { 

    callback(err, entities); 
}); 

查詢給我從子表和父的參考父樣的實體,而是隻有關鍵領域的數據。任何簡單的方法都可以在查詢中同時返回所有內容?

+0

所以說「2谷​​歌數據存儲類型」,但您的示例數據表明只是一種「RequestLedger」,雖然密鑰文字使用不同類型的「request_ledger」和代碼第三個「requestLedger」。你能澄清嗎? –

+0

ResultLedger種類有一個名爲requestLedger的屬性,它是RequestLedger種類 – 1977

回答

1

您可以使用查找方法在一個請求中通過其鍵獲取多個實體。其餘的例子是here我相信JavaScript的實現有一個類似的實現。

請注意,由於api v1可以在單個請求中獲得1000個密鑰的限制。測試版本中並非如此。

這應該帶回您的請求計數,如果你第一次得到孩子,然後查找他們各自的父鍵。

+0

的父級(即外鍵),這聽起來像是一種合理的方法,因爲我只需要提供一頁值得的結果。 0-100,101-200等。 - 所以我可以在2個數據庫查詢中獲得所有內容 – 1977