2017-10-11 56 views
1

我想在mongodb中查詢文檔。 模式如下:python mongoengine如何查詢EmbeddedDocument

class Book(EmbeddedDocument): 
    name = StringField() 
    description = StringField() 

class Category(EmbeddedDocument): 
    name = StringField() 
    books = ListField(EmbeddedDocumentField(Book)) 

class Main(Document): 
    category = EmbeddedDocumentField(Category) 

什麼,我需要的是retireve預訂,名字說「Python的傻瓜」。 我嘗試使用

Main.objects(category__book__name="Python For Dummies")[0] 

以及

Main.objects(__raw__={'category.book.name': 'Python For Dummies'})[0] 

兩者都檢索單個主文檔出這其中有一本書,名爲「Python的傻瓜」之列。但是我想要的是Book嵌入文檔本身不是整個文檔。我的需要是列出單一的書籍信息。就我而言,現在我必須遍歷Main文檔的書目列表,並將名稱與書名匹配以檢索正確的書 - 我認爲mongoengine/python中必須有更好的方法才能實現此目的。

請指教。

回答

0

您可以用only()限制輸出。

查詢

Main.objects(category__books__name="Python For Dummies").only("category.books") 

結果

[{"category": {"books": [{"name": "Python For Dummies"", "description": "a test book"}]}}] 

但是,你想要什麼,不會讓你。要達到此目的,您需要使用aggregate$unwind

查詢

list(Main.objects.aggregate(
    {"$match":{"category.books.name":"Python For Dummies"} }, 
    {"$unwind": "$category.books" }, 
    {"$group":{"_id": None, "books":{"$push":"$category.books"}}} 
)) 

結果

{'_id': None,'books': [{'description': 'a test book', 'name': 'Python For Dummies"'}]}] 
+0

感謝您的投入。但是在使用第一個「only()」選項時,我仍然得到相同的整個響應。第二個是拋出一個錯誤爲無法識別的字段「光標 - Ranjith –

+0

即使唯一的作品,這是罰款,因爲我可以提取。 –