mongoengine中的sql查询

时间:2018-10-05 18:45:29

标签: python mongoengine

我有一个文档和一个嵌入式文档,如下所示。我想查询mongoengine中的嵌入式文档。在sql中,这将是:SELECT A.Nom_PC,B.Intitule from Comptes作为A,Vals作为B WHERE B.Num =“ some value”

class Vals(EmbeddedDocument):
    Num = StringField()
    Intitule = StringField()
    meta = {'allow_inheritance': True}

class Comptes(Document):
    Nom_PC = StringField()
    PC = ListField(EmbeddedDocumentField(Vals))
    meta = {'allow_inheritance': True}

我尝试了一些无法正常工作的事情:

Comptes.objects(Vals__match={ "Num": Num }).aggregate(
       {'$project': {
           'PC': {
               '$filter': {
                   'input': '$PC',
                   'as': 'Vals',
                   'cond': {'$eq': ['$$Vals.Num', Num]}
               }
           }
       }}
   )

1 个答案:

答案 0 :(得分:0)

首先,您确实应该使用

PC = EmbeddedDocumentListField(Vals)

代替

PC = ListField(EmbeddedDocumentField(Vals))

这是因为嵌入文档的列表需要特殊考虑。

关于查询:

q = Comptes.objects(PC__Num="some value")

这将为所有匹配的Comptes文档创建查询。然后,您可以从每个文档中挑选所需的任何数据。

(如果将来需要在EmbeddedDocument中匹配多个项目,请使用match关键字。有关更多信息,请参阅文档。)

例如:

my_list = []
for doc in q:
    for v in doc.PC:
        if v.Num == "some value":
            my_list.append([doc.Nom_PC, v.Intitule])

对于YouTube视频,我详细介绍了EmbeddedDocumentListField:https://www.youtube.com/watch?v=ajwPOyb6VEU&index=6