【问题标题】:Python Eve - where clause using objectidPython Eve - 使用 objectid 的 where 子句
【发布时间】:2015-05-06 14:07:57
【问题描述】:

我在 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

有没有办法做到这一点?

【问题讨论】:

    标签: python eve


    【解决方案1】:

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

    我的意思是,你不能在builds 端点查询sources 端点中是否存在一个文档(你当然可以在sources 端点这样做。)但是,如果你真的存储一个 builds 文档并引用一个 sources 文档,然后您的查询将正常工作,因为您实际上要问的是“get me all 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,这样您的客户就不必明确请求嵌入。

    希望这会有所帮助。

    【讨论】:

      【解决方案2】:

      对 Eve 来说是新手,但我对 Nicola 的“应该工作”有一个进步,因为我的经验是它没有,因为这个问题是在试图处理找出原因的挫败感时出现的问题......

      调试这个库让我达到了 Eve 自动决定签名看起来像“54e328ec537d3d20bbdf2ed5”的东西应该转换为 ObjectId 的地步,这一切都很好。但是,ObjectId:54e328ec537d3d20bbdf2ed5 类型与 string:54e328ec537d3d20bbdf2ed5 类型的比较不是相等的,因此您的过滤器不会返回任何结果

      真正简单的解决方案是将 checkin_id 更改为 ObjectId。前夕初学者可以放心,您不需要所有额外的装饰,因此在上面的示例中,只需将 'type':'string' 更改为 'type':'objectId' 就可以了。具体来说,如果您有调用代码将该字段定义为字符串,则可以保持原样,转换将在 eve 内发生,如上所述,它将按预期工作。

      edit - 另请参阅 eve 的架构级别“query_objectid_as_string”配置设置,在阅读时似乎会覆盖此行为。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-06-25
        • 1970-01-01
        • 2016-03-24
        • 2022-11-10
        • 1970-01-01
        • 2023-03-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多