Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用objectid的pythoneve-where子句_Python_Eve - Fatal编程技术网

使用objectid的pythoneve-where子句

使用objectid的pythoneve-where子句,python,eve,Python,Eve,我在settings.py中定义了以下资源 builds = { 'item_title': 'builds', 'schema': { 'sources': { 'type': 'list', 'schema': { 'type': 'objectid', 'data_relation': { 'resource

我在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是源的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”配置设置,在读取时,该设置似乎会覆盖此行为