2011-02-12 54 views
2

Subquerying具有示例代碼:在MongoEngine

import mongoengine as mongo 

class User(mongo.Document): 
    name = mongo.StringField() 
    age = mongo.IntField()  

class Post(mongo.Document): 
    title = mongo.StringField() 
    author = mongo.ReferenceField(User) 

我想通過用戶低於30歲創建的所有帖子,一個方法是使請求在兩個步驟:

users = User.objects(age__lt=30) 
posts = Post.objects(author__in=users) 

但即使這樣也不完全錯誤,它會不必要地調用並連接到數據庫N次。所以我想在只需一個步驟查詢時,我想:

posts = Post.objects(author__age__lt=30) 

但不起作用,它只是返回我一個空列表,而不是一個錯誤。我究竟做錯了什麼?

回答

1

...它正在呼叫和連接到數據庫N次不必要

MongoDB的支持一個$in子句允許多個對象的選擇只有一個查詢,一個連接。如果你看到多個連接,你應該把這個報告給mongoengine的作者。

由於MongoDB不支持連接,您的方法「加載用戶,加載他們的帖子」通常是正確的方法。

我在做什麼錯?

對於這個詳細程度,你最好的選擇是contact the author directly。 github頁面有他的電子郵件和他的博客。回顧一下,他最近的更新是2010年10月,最後的版本號是0.4。三個月沒有更新是很長的時間,他甚至沒有1.0版本,所以很可能你需要直接與作者交談。

3

我在做什麼錯?

什麼你不能跨引用字段查詢 - 請參見Embed Vs Reference

所以,即使語法是支持的,將採取在幕後兩個查詢。如果它想要的東西 - 給github添加一張票,我會考慮添加它:)

對MongoEngine的更新即將到來 - 因此新版本即將推出! dev分支上有一些令人興奮的改進,包括有效的惰性解引用和更新原子節省的增量變化!

+0

Ross在MongoEngine中有這個功能嗎?肯定會有用的。謝謝。 – Sid 2012-02-26 20:38:38