无法在ListField(嵌入文档字段)上查询

3 投票
2 回答
1239 浏览
提问于 2025-04-17 12:50

我有一个这样的模型:

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))

我想找出那些技能名称为“计算机技能”并且等级大于5的代理人。

我写了以下查询:

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

如果一个代理人有一个名为“计算机技能”的技能,等级是3,同时还有一个名为“英语技能”的技能,等级是10,那么这个代理人会出现在查询结果中。

2 个回答

0

我不使用Python驱动,但你想要实现的功能在MongoDB中的一般写法是这样的……

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

你需要使用一个叫做 $elemMatch 的查询,但目前在mongoengine中没有内置的支持。你必须像这样进行一个原始查询:

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

撰写回答