gpt4 book ai didi

python - 使用 Mongoengine 通过正则表达式匹配嵌入文档

转载 作者:可可西里 更新时间:2023-11-01 10:03:27 25 4
gpt4 key购买 nike

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

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

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

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

最佳答案

作为嵌入式字段,您将需要使用 "double underscore" 的嵌入式语法。 __ 表示与原生 "dot notation" 相比的字段以及 startswith或字符串的 istartswith 修饰符:

Container.objects(list__id__startswith="AAA")

否则,如果您需要一个“真正的”正则表达式而不是允许的快捷方式,那么您可以使用 __raw__带有“原始”MongoDB 语法查询的修饰符:

Container.objects(__raw__={ "list.id": ,re.compile('^AAA', re.IGNORECASE) })

或者可能是 "list._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" }
}}
])

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

关于python - 使用 Mongoengine 通过正则表达式匹配嵌入文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32964126/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com