跳转到主要内容

允许使用mongoengine特定语法的查询代理,以使用AtlasSearch

项目描述

AtlasQ

AtlasQ允许使用AtlasSearch,同时保留MongoEngine的语法。

结构

该软件包试图遵循MongoEngine的结构;主要差异在于transform.pyqueryset.py文件。

转换

与MongoEngine类似,管道中的一个步骤是从Q对象创建查询:我们必须在MongoEngine的通用语法和AtlasSearch允许的语法之间找到对应关系。为此,我们不得不做一些妥协。

目前并非所有关键字都受支持:如果您有一个希望支持的实际情况,请随时在任一时刻打开问题或PR。

查询集

可能有一千种更好的实现方式,如果你真正了解MongoEngine,尤其是PyMongo。不幸的是,我们的知识有限,所以只能这样做。如果你找到了更好的解决方案,请随意提出问题或提交PR。

主要思想是,filter应该像aggregation一样工作。为了实现这一点,并保持与MongoEngine工作方式的兼容性(即,filter应该返回一个Document查询集),我们不得不做一些工作。
调用.aggregate必须按照MongoEngine的预期工作,即返回一个字典列表。

用法

现在最重要的部分:你该如何使用这个包?

from mongoengine import Document, fields

from atlasq import AtlasManager, AtlasQ, AtlasQuerySet

index_name = str("my_index")

class MyDocument(Document):
    name = fields.StringField(required=True)
    surname = fields.StringField(required=True)
    atlas = AtlasManager(index_name)

obj = MyDocument.objects.create(name="value", surname="value2")

qs = MyDocument.atlas.filter(name="value")
assert isinstance(qs, AtlasQuerySet)
obj_from_atlas = qs.first()
assert obj == obj_from_atlas

obj2_from_atlas = MyDocument.atlas.get(AtlasQ(name="value") & AtlasQ(surname="value2"))
assert obj == obj2_from_atlas


obj3_from_atlas = MyDocument.atlas.get(AtlasQ(wrong_field="value"))
assert obj3_from_atlas is None

扩展功能

验证

我们还决定可选地验证索引。检查了以下两点:

  • 索引实际上存在(如果你查询一个不存在的索引,Atlas作为默认行为不会引发任何错误)。
  • 你正在查询的字段实际上是索引过的(如果你查询一个未索引的字段,Atlas作为默认行为不会引发任何错误,并将返回一个空列表)。要进行这些检查,你需要调用查询集上的ensure_index函数。
from mongoengine import Document, fields

from atlasq import AtlasManager, AtlasQ

index_name = str("my_index")

class MyDocument(Document):
    name = fields.StringField(required=True)
    surname = fields.StringField(required=True)
    atlas = AtlasManager(index_name)

result = MyDocument.atlas.ensure_index("user", "pwd", "group", "cluster")
assert result is True
obj1_from_atlas = MyDocument.atlas.get(AtlasQ(name="value")) 
obj2_from_atlas = MyDocument.atlas.get(AtlasQ(wrong_field="value")) # raises AtlasIndexFieldError

内嵌文档

根据你如何创建你的搜索索引,内嵌文档以两种不同的方式进行查询。请确保索引,以便AtlasQ可以知道你的索引是如何定义的。如果你使用了embeddedDocuments类型,AtlasQ将使用embeddedDocument查询语法。否则,如果你使用了document类型,或者你没有确保索引,将使用正常的text搜索和.语法。

上传索引

可以使用AtlasQ直接上传搜索索引,在查询集上调用upload_index函数。对索引本身的语法检查将执行。如果不存在_id但指定了pkid,它将被自动添加,允许在主键上进行有效的文本查询。

from mongoengine import Document, fields

from atlasq import AtlasManager

index_name = str("my_index")
index = {
  "analyzer": "lucene.keyword",
  "mappings": {
    "dynamic": False,
    "fields": {
      "_id": {
        "type": "objectId"
      },
        "name": {
        "type": "string"
      },
      "surname": {
        "type": "string"
      },
    }
  }
}
class MyDocument(Document):
    name = fields.StringField(required=True)
    surname = fields.StringField(required=True)
    atlas = AtlasManager(index_name)

result = MyDocument.atlas.ensure_index("user", "pwd", "group", "cluster")
assert result is False
MyDocument.atlas.upload_index(index, "user", "pwd", "group", "cluster")
result = MyDocument.atlas.ensure_index("user", "pwd", "group", "cluster")
assert result is True

项目详情


下载文件

下载适用于你的平台的文件。如果你不确定选择哪个,请了解更多关于安装包的信息。

源分布

atlasq-tschaume-0.11.1.dev2.tar.gz (38.1 kB 查看散列值)

上传时间

构建分布

atlasq_tschaume-0.11.1.dev2-py3-none-any.whl (15.7 kB 查看散列值)

上传时间 Python 3

由以下机构支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面