2016-11-02 38 views
1

我正面临以下有关FIWARE Orion Context Broker的问题,我希望有人对此有所了解。FIWARE - Orion Context Broker偏移量参数行为

我保存记录FIWARE猎户座CB,1.2.0版本,在泊坞窗实例,并在一个类型的运行,我收到张贴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 
} 

正如你可以看到后以下响应“数”是55811.但是,当我再派GET调用http://mywebsite.eu:1026/v2/entities?type=MyTYPE&offset=54908&limit=1,我收到以下内容:

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

从这个数字偏移(54908)和最多的反应是一样的。我已经检查了服务器中的空间,并且有足够的空间,所以它不是磁盘空间的问题。我已经从我的Raspberries中检查数据是否与Orion CB一样。所以,我的问题是,如果Orion可以存储每种类型的记录的上限,并且达到此限制,我应该更改类型。也许有一些我错过了,任何建议,你可以给我会帮助我很多。

+0

Orion 1.2.0有点旧了,它已被新版本超越(特别是Orion 1.3.0包含了很多错误修正)。升级到最新的Orion版本是否可行?(作为写这篇文章的最新版本:1.5.0)以检查问题是否与它发生一致?谢谢! – fgalan

+0

如果您能够自我回答您自己的问题,以便向具有相同问题的其他潜在用户描述解决方案,那将会很棒。谢谢! – fgalan

+0

我真的很抱歉,我不得不删除我以前的评论。看来问题最终没有解决。我在开始时有这样的印象,但随着数据不断到达猎户座,问题再次出现。我有这种感觉,它是由MongoDB版本引起的。无论如何,我再次感谢你的帮助,当我希望达到某种解决方案时,我会回来。 –

回答

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字段中创建一个索引。在默认的排序的情况下(基于创建日期)的索引可以在蒙戈外壳创建如下(假设orion是您正在使用的数据库的名称):

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

事实上,它使用创建描述为in this section in the documentation的索引是一个好主意。

编辑:响应不是正确的:猎户座应该使用500内部服务器错误和有关问题的描述性消息进行响应。此修补程序已准备好在主分支中着陆,并将包含在Orion 1.7.0中(将于2017年初发布)。

+0

目前,在这种情况下,响应不正确:它应该是500内部服务器错误,并附带描述性消息。 Orion存储库已经创建了一个问题,不久之后将解决:https://github.com/telefonicaid/fiware-orion/issues/2752 – fgalan

+1

通过在mongodb中创建索引解决了问题。我很高兴它将在新的Orion版本中解决。非常感谢@fgalan的帮助。这个问题很长时间是一个真正的麻烦,我放心解决了。我已经根据你的指示更新我的申请。再次感谢你! –

+0

太棒了!如果答案有用,请提供+1并在SOF处接受它为正确的。这不是喂我的自我:)而是向其他有类似问题的用户展示,答案是正确的解决方案。 – fgalan

0

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

让我们考虑一下ASN类型,它有54879个实体(如GET /v2/types/ASN所示)。采用偏移量= 0,我们得到的第一个实体(这恰好是一个id为1470515373636_1):

GET /v2/entities?type=ASN&limit=1 

[ 
    { 
    "id": "1470515373636_1" 
    ... 
    } 
] 

现在,让我们使用偏移54878(等于总数ASN实体减一)。也就是说,跳过第54878个实体只有最后一个保留(这ID恰好是1480344938807_1):

GET /v2/entities?type=ASN&offset=54878&limit=1 

[ 
    { 
    "id": "1480344938807_1" 
    ... 
    } 
] 

需要注意的是,如果我们使用偏移等于实体的总数(或任何更大的数值),即54879,这意味着所有的实体都被跳过了。换句话说,我们正在超越极限。因而是正常的,在这种情况下,猎户座返回实体的空列表:

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

[] 

另一个“一致性”检查:如果你颠倒顺序(默认情况下,实体通过增加创建日期,即从旧到有序较新,但可以使用参数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上下文代理行为似乎与偏移参数相同。你说问题是Orion不会在特定的偏移数字之后返回正确的结果,但是请注意,如果偏移超过了元素的总数,空结果是正确的结果。

+0

首先,我想再次非常感谢你的努力来帮助我。不幸的是,这不是真正的问题。尝试在ASN类型中添加两​​三个以上的实体,并执行GET调用以返回最后一个。在那里,你会看到它不会返回它应该的。相反,如果你在mongo shell里面做同样的事情,你会得到正确的结果。它看起来像Orion在一定数量的相同类型的实体之后,在一个特定的数字(可能)依赖于所有相同类型实体的总量后拒绝返回它们中的任何一个。 –

+0

我想我在添加5个实体之后遇到了问题...我将在独立答案中处理它。 – fgalan

相关问题