Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 通过正则表达式与Mongoengine匹配嵌入文档_Python_Mongodb_Mongodb Query_Pymongo_Mongoengine - Fatal编程技术网

Python 通过正则表达式与Mongoengine匹配嵌入文档

Python 通过正则表达式与Mongoengine匹配嵌入文档,python,mongodb,mongodb-query,pymongo,mongoengine,Python,Mongodb,Mongodb Query,Pymongo,Mongoengine,我有一个文档列表,每个包含50个(可能会有所不同)嵌入文档。现在我想查询所有包含以特定模式开头的id的嵌入文档(在所有文档中) class Container(Document): list = EmbeddedDocumentListField(Data) class Data(EmbeddedDocument): id=StringField(required=True, primary_key=True) 现在,查询(或类似startswith的内容)将位于数据的“id

我有一个文档列表,每个包含50个(可能会有所不同)嵌入文档。现在我想查询所有包含以特定模式开头的id的嵌入文档(在所有文档中)

class Container(Document):
    list = EmbeddedDocumentListField(Data)

class Data(EmbeddedDocument):
    id=StringField(required=True, primary_key=True)

现在,查询(或类似startswith的内容)将位于数据的“id”上。

作为一个嵌入式字段,那么您需要使用
\uuu
的嵌入式语法来表示与本机相比的字段,以及字符串的或
istartswith
修饰符:

Container.objects(list__id__startswith="AAA")
否则,如果您需要一个“真实”正则表达式,而不是允许的快捷方式,则可以将修饰符与“原始”MongoDB语法查询一起使用:

Container.objects(__raw__={ "list.id": ,re.compile('^AAA', re.IGNORECASE) })
或者可能是
“list.\u id”
,具体取决于已告知为嵌入对象序列化字段名的方式

无论哪种方式,基本上都会将查询卸载到数据库中,以便使用其功能确定匹配

当然,mongoengine有一个基本的限制,即无法简单地投影匹配的数组元素。这是关于如何读取和实例化类数据的全部内容

您可以使用
.aggregate()
方法返回“原始python对象”,作为已实现类的替代:

Container._get_collection().aggregate({
    { "$match": { "list.id": ,re.compile('^AAA', re.IGNORECASE) } },
    { "$unwind": "$list" },
    { "$match": { "list.id": ,re.compile('^AAA', re.IGNORECASE) } },
    { "$group": {
        "_id": "$_id",
        "list": { "$push": "$list" }
    }}
])

因此,不再定义相同的
,但如果需要,也没有什么可以阻止您提供原始数据来实例化所需类的新对象。

请不要建议查看所有文档中的每个嵌入文档。我们负担不起O(m*n)I did Container.objects(list\uu id\uu startswith=“AAA”),如果任何嵌入的文档与模式匹配,它将返回所有容器。那么,我们是否应该查看每个容器中嵌入的每个文档,以列出Data@KumarNitin这是一个
mongoengine
限制,因为它不会改变返回的文档,只返回匹配的数组元素。同样的“基本上”也适用于MongoDB本身,但是在原始形式中,您可以使用“投影”返回匹配的“元素”(单数)。MongoEngine本身不会将其作为一类对象,但是
.aggregate()
可以返回一个“普通”对象,其中只包含匹配的“元素”。如果我们对一百万个嵌入文档(每个文档包含50/100个嵌入文档)执行此操作,会影响性能吗?@KumarNitin由于MongoDB在这方面非常聪明,所以一般查询很少。如果您真的只需要筛选出匹配的数组项,那么我使用
.aggregate()
添加了一个示例,其中有用于处理的
$unwind
的其他替代方法,但在使用正则表达式进行匹配时,它实际上不是一个选项
$unwind
会增加开销,因为它本质上会将数组“分解”为双联文档,以便执行其他操作。50胜100负是相当小的,更多的是关于整体比赛的影响有多大。这真的很有帮助。谢谢你,伙计!