Python Eve - where 子句使用 objectid
Python Eve - where clause using objectid
我在 settings.py、
中定义了以下资源
builds = {
'item_title': 'builds',
'schema': {
'sources': {
'type': 'list',
'schema': {
'type': 'objectid',
'data_relation': {
'resource': 'sources',
'embeddable': True,
}
}
},
'checkin_id': {
'type': 'string',
'required': True,
'minlength': 1,
},
}
}
当我尝试根据值为 objectid 的成员进行过滤时,我得到空列表。
http://127.0.0.1:5000/builds?where={"sources":"54e328ec537d3d20bbdf2ed5"}
54e328ec537d3d20bbdf2ed5是source的id
有办法吗?
假设您确实在任何 builds
文档的任何 sources
字段中包含 54e328ec537d3d20bbdf2ed5
值,您的查询应该可以正常工作。
我的意思是,您不能在 sources
端点查询 builds
端点是否存在文档(您当然可以在 sources
端点。)但是,如果您实际上存储了一个 builds 文档并且它引用了一个 sources 文档,那么您的查询将正常工作,因为您实际上是问是"get me all builds documents which have a reference to this sources document"。例如,如果您 POST 将这样的文档发送到 builds
端点:
{
"sources": ["54e328ec537d3d20bbdf2ed5"]
"checkin_id": "A"
}
然后这个查询:
http://127.0.0.1:5000/builds?where={"sources":"54e328ec537d3d20bbdf2ed5"}
请问return那个文件。当然,既然您将 sources
定义为可嵌入的,您也可以这样做:
http://127.0.0.1:5000/builds?where={"sources":"54e328ec537d3d20bbdf2ed5"}&embedded={"sources":1}
这将使您将参考文档与任何匹配文档一起嵌入,如下所示:
{
"sources": [{"field1": "hey", "field2":"I'm an embedded source"}]
"checkin_id": "A"
}
而你会得到一个没有显式嵌入的 'raw' 文档。可能值得一提的是,您还可以启用 predefined embedding 引用资源,因此您的客户不必明确请求嵌入。
希望对您有所帮助。
Eve 的新手,但我比 Nicola 的 "should work" 有进步,因为我的经验是它没有,因为这个问题是在试图处理弄清楚原因的挫败感时出现的问题。 ..
调试这个库让我到了 Eve 自动决定将签名看起来像“54e328ec537d3d20bbdf2ed5”的东西转换为 ObjectId 的地步,这一切都很好。但是,类型 ObjectId:54e328ec537d3d20bbdf2ed5 与类型 string:54e328ec537d3d20bbdf2ed5 的比较不相等,因此您的过滤器 returns 没有结果
真正简单的解决方案是将 checkin_id 更改为 ObjectId。 Eve 初学者可以放心,你不需要所有额外的装饰,所以在上面的例子中,只需将 'type':'string' 更改为 'type':'objectId' 就可以了。具体来说,如果您有调用代码,其中此字段定义为字符串,您可以保持原样,转换将在 eve 内发生,如上所述,它将按预期工作。
编辑 - 另请参阅 eve 的架构级别 "query_objectid_as_string" 配置设置,阅读后似乎会覆盖此行为。
我在 settings.py、
中定义了以下资源builds = {
'item_title': 'builds',
'schema': {
'sources': {
'type': 'list',
'schema': {
'type': 'objectid',
'data_relation': {
'resource': 'sources',
'embeddable': True,
}
}
},
'checkin_id': {
'type': 'string',
'required': True,
'minlength': 1,
},
}
}
当我尝试根据值为 objectid 的成员进行过滤时,我得到空列表。
http://127.0.0.1:5000/builds?where={"sources":"54e328ec537d3d20bbdf2ed5"}
54e328ec537d3d20bbdf2ed5是source的id
有办法吗?
假设您确实在任何 builds
文档的任何 sources
字段中包含 54e328ec537d3d20bbdf2ed5
值,您的查询应该可以正常工作。
我的意思是,您不能在 sources
端点查询 builds
端点是否存在文档(您当然可以在 sources
端点。)但是,如果您实际上存储了一个 builds 文档并且它引用了一个 sources 文档,那么您的查询将正常工作,因为您实际上是问是"get me all builds documents which have a reference to this sources document"。例如,如果您 POST 将这样的文档发送到 builds
端点:
{
"sources": ["54e328ec537d3d20bbdf2ed5"]
"checkin_id": "A"
}
然后这个查询:
http://127.0.0.1:5000/builds?where={"sources":"54e328ec537d3d20bbdf2ed5"}
请问return那个文件。当然,既然您将 sources
定义为可嵌入的,您也可以这样做:
http://127.0.0.1:5000/builds?where={"sources":"54e328ec537d3d20bbdf2ed5"}&embedded={"sources":1}
这将使您将参考文档与任何匹配文档一起嵌入,如下所示:
{
"sources": [{"field1": "hey", "field2":"I'm an embedded source"}]
"checkin_id": "A"
}
而你会得到一个没有显式嵌入的 'raw' 文档。可能值得一提的是,您还可以启用 predefined embedding 引用资源,因此您的客户不必明确请求嵌入。
希望对您有所帮助。
Eve 的新手,但我比 Nicola 的 "should work" 有进步,因为我的经验是它没有,因为这个问题是在试图处理弄清楚原因的挫败感时出现的问题。 ..
调试这个库让我到了 Eve 自动决定将签名看起来像“54e328ec537d3d20bbdf2ed5”的东西转换为 ObjectId 的地步,这一切都很好。但是,类型 ObjectId:54e328ec537d3d20bbdf2ed5 与类型 string:54e328ec537d3d20bbdf2ed5 的比较不相等,因此您的过滤器 returns 没有结果
真正简单的解决方案是将 checkin_id 更改为 ObjectId。 Eve 初学者可以放心,你不需要所有额外的装饰,所以在上面的例子中,只需将 'type':'string' 更改为 'type':'objectId' 就可以了。具体来说,如果您有调用代码,其中此字段定义为字符串,您可以保持原样,转换将在 eve 内发生,如上所述,它将按预期工作。
编辑 - 另请参阅 eve 的架构级别 "query_objectid_as_string" 配置设置,阅读后似乎会覆盖此行为。