Python mongoengine如何查询EmbeddedDocument

时间:2017-10-11 12:27:02

标签: python mongodb mongoengine

我正在尝试在mongodb中查询文档。

架构如下:

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

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

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

我需要的是检索书名为" Python For Dummies"。 我尝试使用

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

以及

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

两者都从列表中检索单个主文档,其中有一本名为" Python For Dummies"的书。但我想要的只是Book嵌入式文档而不是整个文档。我需要列出单一的书籍信息。在我的情况下,现在我必须再遍历主文档的书籍列表并将名称与书名匹配以检索正确的书籍 - 我认为mongoengine / python必须有更好的方法才能实现这一点

请建议。

1 个答案:

答案 0 :(得分: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"'}]}]