python mongoengine如何查询EmbeddedDocument

python mongoengine如何查询EmbeddedDocument

问题描述:

我想在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中必须有更好的方法才能实现此目的。

请指教。

您可以用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

即使唯一的作品,这是罚款,因为我可以提取。 –