2016-12-23 5 views
1

特定のEmbeddedDocumentのベースでドキュメントを取得していますが、検索中にEmbeddedDocumentsのすべてを取得したくない場合は、EmbeddedDocumentと一致するもののみをDocumentとします。ここで選択した埋め込みドキュメントのみをmongoengineに含めるにはどうすればいいですか?

は私のコードです:

学校組み込みドキュメント

class School(EmbeddedDocument): 
    name = StringField(max_length=120) 

ユーザードキュメント

class User(Document): 
    first_name = StringField(max_length=60, required=True) 
    last_name = StringField(max_length=60) 
    schools = EmbeddedDocumentListField(School) 

給餌文書:

user = User.objects.create(first_name="Rohit", last_name="Khatri") 
user.schools = [ 
    School(name="Auden High School")), 
    School(name="Baldwin Boys High School"), 
    School(name="Baldwin Girls High School"), 
    School(name="Aukamm Elementary School"), 
    School(name="Mason-Rice Elementary") 
] 
user.save() 

user = User.objects.create(first_name="ABC", last_name="DEF") 
user.schools = [ 
    School(name="Little Harbor Elementary School")), 
    School(name="Aukamm Elementary School"), 
    School(name="Mason-Rice Elementary") 
] 
user.save() 
私はこのコードを使用してい

そのschools分野における特定の学校を持っているusersを取得:私は学校のフィールドでAukamm Elementary Schoolでのみ選択された学校を取得したい

users = User.objects(school__match={"name": "Aukamm Elementary School"}) 

[ 
    { 
     "first_name": "Rohit", 
     "last_name": "Khatri", 
     "schools": [ 
      { 
       "name": "Auden High School" 
      }, 
      { 
       "name": "Baldwin Boys High School" 
      }, 
      { 
       "name": "Baldwin Girls High School" 
      }, 
      { 
       "name": "Aukamm Elementary School" 
      }, 
      { 
       "name": "Mason-Rice Elementary" 
      } 
     ] 
    }, 
    { 
     "first_name": "ABC", 
     "last_name": "DEF", 
     "schools": [ 
      { 
       "name": "Little Harbor Elementary School" 
      }, 
      { 
       "name": "Aukamm Elementary School" 
      }, 
      { 
       "name": "Mason-Rice Elementary" 
      } 
     ] 
    } 
] 

必要な出力

[ 
    { 
     "first_name": "Rohit", 
     "last_name": "Khatri", 
     "schools": [ 
      { 
       "name": "Aukamm Elementary School" 
      } 
     ] 
    }, 
    { 
     "first_name": "ABC", 
     "last_name": "DEF", 
     "schools": [ 
      { 
       "name": "Aukamm Elementary School" 
      } 
     ] 
    } 
] 

を受け

おかげ

答えて

1

あなたは$filter演算子を使用することができます3210は、

users = User.objects(school__match={ "name": "Aukamm Elementary School" }).aggregate(
    { "$project": { 
     "first_name": 1, 
     "last_name": 1, 
     "schools": { 
      "$filter": { 
        "input": "$schools", 
        "as": "school", 
        "cond": { "$eq": [ "$$school.name", "Aukamm Elementary School" ] } 
      } 
     } 
    } } 
) 
+1

として機能します。 –

関連する問題