【问题标题】:How to do bulk lookups of mongo documents with post in Eve?如何在 Eve 中使用 post 批量查找 mongo 文档?
【发布时间】:2015-12-22 08:38:06
【问题描述】:

我使用 Eve (flask) 作为 mongodb 的 API 接口。现在我正在尝试通过此界面设置项目的批量查找。这意味着我想批量查找文档。

通常您会为此使用 get。因此,例如,如果您有一个包含字段名称和电话号码的人员的集合,您可以请求端点 /person/less name 更大,并返回包含电话号码的相应文档。

如果你想一次查找多个文档,比如说,按照我们的例子,你需要几个人的电话号码,每个人单独查找会很昂贵,即需要很长时间才能得到电话号码.

您可以使用 ?where={"name" $in ["Pedro", "Juan"]} 之类的方法通过一个获取请求获取两个人的电话号码,这比这样做更有效(=更快)两个获取请求,每个请求一个。但是,此方法的适用性有限,因为 get 请求的最大长度约为 64K (1),这意味着如果我们假设名称长度约为 10-20,则只能以这种方式检索数千个文档人物。

因此,大型查找的自然方法似乎是使用发布请求。但是,据我所知,eve post 界面是用于插入,而不是用于查找(查找)。

我已经使用烧瓶手动实现了一些端点的帖子查找,但是有没有办法为此使用 Eve?直截了当:有没有办法通过发布请求批量查找文档?

【问题讨论】:

  • 我不确定我是否理解您想要实现的目标。您会编辑并为您的问题添加一个示例吗?
  • 添加了一个例子,干杯。

标签: post flask pymongo eve


【解决方案1】:

您可以使用动态查找过滤器。基本上,您将回调函数挂钩到每个 GET 请求。在您的回调中,根据需要将lookup 更新为 (source):

def pre_GET(resource, request, lookup):
    lookup["name"] = {'$in': list_of_names}


 app = Eve()

 app.on_pre_GET += pre_GET
 app.run()

或者您甚至可以设置预定义的数据过滤器(来源):

people = {
    'datasource': {
        'filter': {'username': {'$exists': True}}
        }
}

第二个选项使过滤器成为静态过滤器,但您仍然可以将它与动态过滤器混合使用。

不过,总的来说,这整件事闻起来很糟糕。我不知道您的用例,但可以考虑替代方法,例如引入“customer_type”字段进行查询。这可能会使性能和代码维护更容易。

无论如何,如果您正在查询,POST 不是要查找的地方。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 2013-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多