簡體   English   中英

查詢ReferenceProperty

[英]Query on ReferenceProperty

鑒於我在數據存儲區中有以下實體:

class Owner(db.Model):
  name = db.StringProperty()
  age = db.IntegerProperty()

class Pet(db.Model):
  name = db.StringProperty()
  owner = db.ReferenceProperty(Owner)

並且有些業主沒有寵物,如何最好地提取所有擁有寵物的業​​主,按業主年齡排序? 我知道JOINS是不可能的,所以似乎有兩個查詢。

我試圖從Pets中提取所有所有者密鑰,然后使用密鑰完成了“IN”查詢,但我達到了最多30個子查詢限制。

我會在Owner類中添加一兩個屬性。

定義一個布爾字段owns_pets (或類似),當您添加寵物時,將其設置為True,然后選擇所有owns_pets == True Owners,按Age排序,然后使用反向集為每個所有者獲取寵物。

或者添加一個ListProperty pets其中包含所有pets的所有鑰匙。 然后查詢所有所有者(再次使用上面的布爾值更容易)然后db.get(some_owner.pets)

如果沒有其中任何一種,你就會有一些不太簡單的方法。

循環遍歷年齡順序中的所有者集,獲取反向引用集(在您的情況下為pet_set )跳過其中pet_set不返回任何內容的所有者。

其他方法包括獲取所有寵物,收集所有者的密鑰(在一個集合中,刪除重復項),然后db.get(所有者密鑰列表),然后在代碼中對它們進行排序 - 如果你有很多,那么效率不高或者可能不可行(內存/時間)。)如果要使用此路徑,請查看nick johnson預取引用集代碼http://blog.notdot.net/2010/01/ReferenceProperty-prefetching-in-App -發動機

真正最好的選擇是在寫入時開始存儲冗余數據,這使得經常使用的查詢執行成本更低。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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