2017-10-11 1 views
1

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 "인형에 대한 파이썬을"말을하는 것입니다. 나는 모두있는 이름 "인형에 대한 파이썬"을 가진 책이 목록에서 하나의 주 문서를 검색하는

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

뿐만 아니라

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

를 사용했습니다. 하지만 내가 원했던 것은 Book 임베디드 문서 만이 전체 문서가 아닌 것이다. 저의 단서 정보를 열람 할 필요가 있습니다. 내 경우에는 이제 다시 주 문서의 도서 목록을 통해 트래버스하고 올바른 책을 검색하기 위해 책의 이름과 이름을 일치시켜야합니다. 몽고인/파이썬에서 더 나은 방법이 있어야한다고 생각합니다.

상담하십시오.

답변

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

감사합니다. 하지만 난 여전히 첫 번째 "전용()"옵션을 사용하는 동안 동일한 전체 응답을 받고있다. 그리고 두 번째 하나는 인식 할 수없는 필드 "커서로 오류를 던지고있다."- Ranjith –

+0

유일한 경우에도 추출 할 수 있기 때문에 괜찮습니다. –

관련 문제