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" 配置设置,阅读后似乎会覆盖此行为。