如何在 Eve 中使用 post 批量查找 mongo 文档?
How to do bulk lookups of mongo documents with post in Eve?
我正在使用 Eve(烧瓶)作为 API 到 mongodb 的接口。现在我正在尝试通过此界面设置项目的批量查找。这意味着我想批量查找文档。
通常你会为此使用get。因此,例如,如果您有一组具有字段名称和 phone 编号的人员,您可以请求端点 /person/ less name greater 并取回包含 phone 编号的相应文档。
如果你想一次查找几个文档,比如说,按照我们的例子,你需要 phone 几个人,每个人单独查找会很昂贵,即需要很长时间是时候获得 phone 个数字了。
您可以使用类似 ?where={"name" $in ["Pedro", "Juan"]} 的方法来获取两个人的 phone 个号码请求,这比执行两个 get 请求更有效(=更快),每个请求一个。但是,此方法的适用性有限,因为 get 请求的最大长度约为 64K (1),这意味着如果我们假设名称长度约为 10,则只能以这种方式检索上千个文档-20 个字符。
因此,使用 post 请求似乎是进行较大查找的自然方法。然而,据我所知,eve post 接口是用于插入的,而不是用于查找(find)的。
我已经使用 Flask 手动实现了一些端点的 post 查找,但是有没有办法使用 Eve 来实现这一点?重点:有没有办法通过 post 请求批量查找文档?
您可以使用动态查找过滤器。基本上,您将回调函数挂接到每个 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 不是要查找的地方。
我正在使用 Eve(烧瓶)作为 API 到 mongodb 的接口。现在我正在尝试通过此界面设置项目的批量查找。这意味着我想批量查找文档。
通常你会为此使用get。因此,例如,如果您有一组具有字段名称和 phone 编号的人员,您可以请求端点 /person/ less name greater 并取回包含 phone 编号的相应文档。
如果你想一次查找几个文档,比如说,按照我们的例子,你需要 phone 几个人,每个人单独查找会很昂贵,即需要很长时间是时候获得 phone 个数字了。
您可以使用类似 ?where={"name" $in ["Pedro", "Juan"]} 的方法来获取两个人的 phone 个号码请求,这比执行两个 get 请求更有效(=更快),每个请求一个。但是,此方法的适用性有限,因为 get 请求的最大长度约为 64K (1),这意味着如果我们假设名称长度约为 10,则只能以这种方式检索上千个文档-20 个字符。
因此,使用 post 请求似乎是进行较大查找的自然方法。然而,据我所知,eve post 接口是用于插入的,而不是用于查找(find)的。
我已经使用 Flask 手动实现了一些端点的 post 查找,但是有没有办法使用 Eve 来实现这一点?重点:有没有办法通过 post 请求批量查找文档?
您可以使用动态查找过滤器。基本上,您将回调函数挂接到每个 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 不是要查找的地方。