查询MongoEngine使用或操作的EmbeddedDocumentFieldList

时间:2018-07-09 10:06:58

标签: python mongodb mongoengine

我正在尝试查询EmbeddedDocumentFieldList字段中的某些内容,并且想在一定条件下使用或操作。 架构为自爆:

class EmbeddedDoc(EmbeddedDocument):
     name = StringField()

class ParentDoc(Document):
     name = StringField():
     children = EmbeddedDocumentFieldList(EmbeddedDoc)

然后我想获取ParentDoc的名为“ a”或“ b”的子对象,我尝试使用Q函数,但是程序抛出了一个异常,说“过滤器方法采用了1个参数,但给了2个参数”。 还有其他方式吗? 谢谢

1 个答案:

答案 0 :(得分:0)

我不知道您的“ Q”功能在做什么,但是我将向您展示如何查询嵌入式文档。 (编辑:我现在看到您在谈论“ Q”。添加到下面的答案中)

看你的模特〜

class EmbeddedDoc(EmbeddedDocument):
    name = StringField()

    def to_json(self):
        return {
            "name": self.name 
        }


class ParentDoc(Document):
    name = StringField()
    children = EmbeddedDocumentFieldList(EmbeddedDoc)

    def to_json(self):
        return {
            "_id": str(self.pk),
            "name": self.name,
            "children": [child.to_json() for child in self.children]
        }

我重写了to_json()方法,使其更易于阅读。该部分是可选的,但我建议使用。 我会用我的方法做这样的事〜

pdoc = ParentDoc.objects(pk=some_ID_variable)
if pdoc:
    pdoc = pdoc.get(pk=some_ID_variable)
    if pdoc.children.filter(name=some_name_variable):
        child = pdoc.children.get(name=some_name_variable)
        return child.to_json()
    return {"message": "Child with that name not found"}
return {"message": "Parent with ID not found"}

这是怎么回事?首先,我查询以查看ParentDoc是否存在。如果存在,请从查询集中获取ParentDoc对象。由于嵌入对象没有主键,因此可以使用过滤器按名称查询对象的嵌入对象。如果存在,则以json格式返回嵌入的对象。

根据advanced queries部分的Mongoengine用户指南,要使用or运算符,我需要使用or按位运算符“ |”以及Q类。 所以我要添加这个〜

from mongoengine.queryset.visitor import Q

并将上面的过滤器更改为类似的内容〜

children = []
cdocs = pdoc.children.filter(Q(someParam=someValue) | Q(anotherParam=anotherValue))
children.append(cdoc.tojson() for cdoc in cdocs)
return {"Children": children}

我还没有使用过。希望对你有用!