Python mongoengine 如何查询一个EmbeddedDocument

Python mongoengine How to query an EmbeddedDocument

我正在尝试查询 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 中必须有更好的方法来实现这一点。

请指教

您可以使用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"'}]}]