нельзя запросить через ListField (EmbeddedDocumentField) - PullRequest
3 голосов
/ 11 февраля 2012

У меня есть следующая модель

class Skill(EmbeddedDocument):
   name =  StringField(required = True)
   level = IntField(required = True)

class Agent(Document):
   name = StringField(required = True)
   email = EmailField(required = True, unique = True)
   skills = ListField(EmbeddedDocumentField(Skill))

Я хочу найти агентов, обладающих навыками с (name = "навыки работы с компьютером и уровень> 5)

Я написал следующий запрос:

 Agent.objects.filter(name='ashraf',  skills__level__gt=5,skills__name="Computer Skills")

Если у агента есть навык «Навыки работы с компьютером» с уровнем = 3, а также с навыком «Навыки английского языка» с уровнем = 10, этот агент будет в результате запроса

Ответы [ 2 ]

2 голосов
/ 13 февраля 2012

Вам нужно будет выполнить запрос $elemMatch [1], и в настоящее время в mongoengine его нет встроенной поддержки.Вам нужно выполнить запрос raw следующим образом:

Agent.objects.filter(
    name='ashraf',  
    __raw__={"skills": {
        "$elemMatch": {
            "level": {"$gt": 5}, 
            "name": "Computer Skills"
        }
    }}
)

[1] http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%24elemMatch

0 голосов
/ 11 февраля 2012

Я не использую драйвер python, но общий синтаксис Монго для того, что вы пытаетесь выполнить, заключается в следующем ...

db.agent.find({name:'ashraf', 'skills.name' : "computer skills", level:{ $gt: 5}})
...