使用objectid的pythoneve-where子句
我在settings.py中定义了以下资源使用objectid的pythoneve-where子句,python,eve,Python,Eve,我在settings.py中定义了以下资源 builds = { 'item_title': 'builds', 'schema': { 'sources': { 'type': 'list', 'schema': { 'type': 'objectid', 'data_relation': { 'resource
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是源的id
还有其他方法吗?假设您在任何
构建
文档中的任何源
字段中都包含54e328ec537d3d20bbdf2ed5
值,那么您的查询应该可以正常工作
我的意思是,您不能查询构建
端点,以确定源
端点中是否存在文档(当然可以在源
端点处进行查询)。但是,如果您实际存储了构建文档,并且它引用了源文档,然后您的查询将很好地工作,因为您实际要求的是“获取所有引用此源文档的构建文档”。例如,如果将这样的文档发布到builds
端点:
{
"sources": ["54e328ec537d3d20bbdf2ed5"]
"checkin_id": "A"
}
然后这个查询:
http://127.0.0.1:5000/builds?where={"sources":"54e328ec537d3d20bbdf2ed5"}
将返回该文档。当然,由于您将源定义为可嵌入的,因此您还可以执行以下操作:
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"
}
然而,如果没有显式嵌入,您将得到一个“原始”文档。可能值得一提的是,您还可以启用对引用资源的访问,这样您的客户机就不必显式地请求嵌入
希望这能有所帮助。伊芙新手,但我对尼古拉的“应该工作”有一个改进,因为我的经验是,它没有,因为这个问题是当我试图处理弄清楚为什么
通过调试这个库,Eve自动决定将签名类似于“54e328ec537d3d20bbdf2ed5”的内容强制转换为ObjectId,这很好。但是,类型ObjectId:54e328ec537d3d20bbdf2ed5与类型string:54e328ec537d3d20bbdf2ed5的比较并不相等,因此过滤器不会返回任何结果
真正简单的解决方案是将checkin_id更改为ObjectId。Eve初学者可以放心,您不需要所有额外的装饰,因此在上面的示例中,只需将'type':'string'更改为'type':'objectId'就可以了。具体地说,如果您有调用代码,其中该字段定义为字符串,则可以保持原样,强制转换将在eve中发生,如上所述,它将按预期工作
编辑-另请参阅eve的模式级别“query\u objectid\u as\u string”配置设置,在读取时,该设置似乎会覆盖此行为