2017-10-11 14 views
1

mongodbでドキュメントを照会しようとしています。 スキーマは以下の通りです:python mongoengine埋め込みドキュメントを照会する方法

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

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

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

私は必要なもの「ダミーのためのPython」と言う名前でブックをretireveすることです。 私はどちらも、名前「ダミーのためのPython」と本がそこであるリストの中から一つのメイン文書を検索している

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

など

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

を使用してみました。しかし、私が望むのは、ドキュメント全体ではなく、ブック組み込みドキュメントだけです。私の必要性は、その単一の本の情報をリストすることです。私の場合は、今度はメイン文書の書籍リストをもう一度探し、正しい本を検索するために名前をブックの名前と一致させる必要があります。これを達成するには、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()"オプションを使用している間、同じ全体の応答を取得しています。そして2番目のものは認識できないフィールド "cursor"としてエラーを投げていた。 - Ranjith –

+0

唯一の作品でも、私は抽出できるので、それは問題ない。 –

関連する問題