Python Eve - where子句使用objectid

时间:2015-05-06 14:07:57

标签: python eve

我在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是来源的身份

有没有这样做?

2 个答案:

答案 0 :(得分:3)

您的查询应该可以正常运行,假设您在54e328ec537d3d20bbdf2ed5个文档中的任何sources字段中实际包含builds值。

我的意思是,您无法向builds端点查询sources端点中是否存在文档(您当然可以在sources处执行此操作但是,如果您实际存储 builds 文档并且它引用了 sources 文档,那么您的查询将正常工作,因为您实际要求的是"给我所有 builds 文件,这些文件引用了这个来源文件"。例如,如果您将此类文档发布到builds端点:

{
    "sources": ["54e328ec537d3d20bbdf2ed5"]
    "checkin_id": "A"
}

然后这个查询:

http://127.0.0.1:5000/builds?where={"sources":"54e328ec537d3d20bbdf2ed5"}

将返回那个文件。当然,既然您将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"
}

而你会得到一个原始的'没有显式嵌入的文档。值得一提的是,您还可以启用predefined embedding引用的资源,这样您的客户就不必明确请求嵌入。

希望这有帮助。

答案 1 :(得分:0)

夏娃新手,但我在Nicola"上工作了#34;因为我的经验是它没有,因为这个问题是在试图处理弄清楚原因的挫折...

调试这个库让我达到了这样的程度,即夏娃自动地决定具有看起来像" 54e328ec537d3d20bbdf2ed5"应该转换为ObjectId,这一切都很好。但是,ObjectId:54e328ec537d3d20bbdf2ed5类型与类型字符串:54e328ec537d3d20bbdf2ed5的比较不相等,因此您的过滤器不返回任何结果

真正简单的解决方案是将checkin_id更改为ObjectId。夏娃初学者可以放心,你不需要所有额外的装饰,所以在上面的例子中只需更改键入':' string'到'键入':' objectId'并且会很好。具体来说,如果您调用此字段被定义为字符串的代码,您可以保持原样,如上所述,转换将在eve中发生,并且它将按预期工作。

编辑 - 参见eve的架构级别" query_objectid_as_string"读取时的配置设置似乎会覆盖此行为。