首页 文章

FIWARE - Orion Context Broker偏移参数行为

提问于
浏览
1

我正面临关于FIWARE Orion Context Broker的以下问题,我希望有人对此有所了解 .

我将记录存储在FIWARE Orion CB,版本1.2.0中,在Docker实例中运行,在一种类型中,我在发送GET调用后收到以下响应http://mywebsite.eu:1016/v2/types/MyTYPE

{
    "attrs": {
        "cid": {
            "types": [
                "String"
            ]
        },
        "datetime": {
            "types": [
                "String"
            ]
        },
        "humidity": {
            "types": [
                "Float"
            ]
        },
        "luminosity": {
            "types": [
                "Integer"
            ]
        },
        "temperature": {
            "types": [
                "Float"
            ]
        }
    },
    "count": 55811
}

正如您所看到的,“count”是55811.但是,当我向http://mywebsite.eu:1026/v2/entities?type=MyTYPE&offset=54908&limit=1发送另一个GET调用时,我会收到以下信息:

[
    {
        "id": ".*",
        "type": "MyTYPE"
    }
]

从该偏移量(54908)及以上,响应是相同的 . 我已经检查了服务器中的空间并且有足够的空间,所以这不是磁盘空间问题 . 我已经检查过数据是从Raspberries中以与以前相同的方式进入Orion CB . 所以,我的问题是,如果Orion可以存储的每种类型的记录有一个上限,当达到此限制时,我应该更改类型 . 也许有一些我想念的东西,你给我的任何建议都会对我有所帮助 .

2 回答

  • 0

    据观察,使用较大的偏移值可能会产生以下影响:

    • 你得到的答案是问题提到的答案,例如:
    [
        {
            "id": ".*",
            "type": "ASN"
        }
    ]
    
    • Orion日志中出现如下错误消息:
    Raising alarm DatabaseError: nextSafe(): { $err: "Executor error: OperationFailed Sort operation used more than the maximum 33554432 bytes of RAM. Add an index, or specify a smaller limit.", code: 17144 }
    

    解决方案是在用于排序的DB字段中创建索引 . 在默认排序的情况下(基于创建日期),可以在Mongo shell中创建索引,如下所示(假设 orion 是您正在使用的DB的名称):

    $ mongo
    > use orion
    > db.entities.createIndex({creDate: 1})
    

    实际上,创建描述in this section in the documentation的索引是一个好主意 .

    EDIT :响应不正确:Orion应使用500内部服务器错误响应,并提供有关问题的描述性消息 . 此修复程序已准备好进入主分支,并将包含在Orion 1.7.0中(将于2017年初发布) .

  • 0

    offset参数表示在返回结果之前必须跳过多少个元素 . 因此,offset = 0(如果省略偏移参数则为defaulf值)意味着从第一个元素开始,offset = 1表示从第二个元素开始,即 .

    让我们考虑ASN类型,它有54879个实体(显示为 GET /v2/types/ASN ) . 使用offset = 0,我们得到第一个实体(恰好是id为 1470515373636_1 的实体):

    GET /v2/entities?type=ASN&limit=1
    
    [
      {
        "id": "1470515373636_1"
        ...
      }
    ]
    

    我们现在使用偏移54878(等于ASN实体的总数减1) . 也就是说,跳过第一个54878实体只剩下最后一个(id恰好是 1480344938807_1 ):

    GET /v2/entities?type=ASN&offset=54878&limit=1
    
    [
      {
        "id": "1480344938807_1"
        ...
      }
    ]
    

    请注意,如果我们使用的偏移量等于实体总数(或任何更大的数量),即54879,则表示已跳过所有实体 . 换句话说,我们超越了极限 . 因此,在这种情况下,Orion返回一个空的实体列表是正常的:

    GET /v2/entities?type=ASN&offset=54879&limit=1
    
    []
    

    另一个"consistency"检查:如果您反转顺序(默认情况下,实体按增加创建日期排序,即从较旧到较新,但您可以使用 orderBy 参数更改),您可以检查前一个元素现在是最后一个反之亦然 . 特别是, orderBy=!dateCreated 订单的结果是减少创建日期(即从较新到较旧) .

    因此,现在搜索第一个元素返回前一个元素(即 1480344938807_1

    GET /v2/entities?type=ASN&limit=1&orderBy=!dateCreated
    
    [
      {
        "id": "1480344938807_1"
        ...
      }
    ]
    

    并搜索最后一个元素返回前一个元素(即 1470515373636_1

    GET /v2/entities?type=ASN&offset=54878&limit=1&orderBy=!dateCreated
    
    [
      {
        "id": "1470515373636_1"
        ...
      }
    ]
    

    我们再做一次测试吧 . 让我们添加一个新的ASN实体,只是为了好玩:

    POST /v2/entities?options=keyValues
    
    {
      "id": "TestingEntity",
      "type": "ASN",
      "A": 42
    }
    

    所以,现在ASN类型中的实体总数是54880.新实体是最后一个要创建的实体,因此它将以默认顺序(即增加创建日期)放在最后 . 您可以使用以下查询进行检查:

    GET /v2/entities?type=ASN&offset=54879&limit=1
    
    [
      {
        "id": "TestingEntity"
        ...
      }
    ]
    

    请注意,该查询在添加新实体之前返回 [] (参见上文) .

    总而言之,Orion Context Broker行为似乎与偏移参数一样 . 你说问题是猎户座在特定的偏移数字后不会返回正确的结果,但请注意,如果你的偏移超过了元素总数,那么空结果是正确的结果 .

相关问题