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"'}]}]
感谢您的投入。但是在使用第一个“only()”选项时,我仍然得到相同的整个响应。第二个是抛出一个错误为无法识别的字段“光标 - Ranjith –
即使唯一的作品,这是罚款,因为我可以提取。 –