修复由于 Orion 0.17.0 之前创建的实体导致的重名问题
Fix duplicate name situation due to entities created before Orion 0.17.0
从 Orion 0.17.0 开始,属性类型不再用作属性 "identification key"。但是,我有使用 0.17.0 之前版本创建的实体,这些实体具有相同名称和不同类型的属性。例如,以下实体有 "ActivePower" 个重复项:
> db.entities.findOne({"_id.type": "Regulator", "_id.id": "OUTSMART.RG_LAS_LLAMAS_01", "_id.servicePath": "/"})
{
"_id" : {
"type" : "Regulator",
"id" : "OUTSMART.RG_LAS_LLAMAS_01",
"servicePath" : "/"
},
"attrs" : [
{
"name" : "TimeInstant",
"value" : "2015-04-27T01:51:36.000000Z",
"type" : "urn:x-ogc:def:trs:IDAS:1.0:ISO8601",
"modDate" : 1430092302
},
{
"name" : "ActivePower",
"value" : "11778",
"type" : "urn:x-ogc:def:phenomenon:Outsmart:1.0:ActivePower",
"modDate" : 1430092302
},
{
"name" : "ReactivePower",
"value" : "8414",
"type" : "urn:x-ogc:def:phenomenon:Outsmart:1.0:ReactivePower",
"modDate" : 1430092302
},
{
"name" : "electricPotential",
"value" : "231",
"type" : "urn:x-ogc:def:phenomenon:IDAS:1.0:electricPotential",
"modDate" : 1430092302
},
{
"name" : "electricCurrent",
"value" : "20890",
"type" : "urn:x-ogc:def:phenomenon:IDAS:1.0:electricCurrent",
"modDate" : 1430092302
},
{
"name" : "Latitud",
"value" : "43.4716987609863",
"type" : "urn:x-ogc:def:phenomenon:IDAS:1.0:latitude",
"modDate" : 1414522843
},
{
"name" : "Longitud",
"value" : "-3.80692005157471",
"type" : "urn:x-ogc:def:phenomenon:IDAS:1.0:longitude",
"modDate" : 1401818472
},
{
"name" : "ActivePower",
"creDate" : 1393420396,
"value" : "11778.2",
"type" : "float",
"modDate" : 1430092302
}
],
"modDate" : 1430092302
}
我如何使该实体适应 Orion 0.17.0 及更高版本?
最简单的解决方案是使用 mongo 控制台编辑实体,删除所有具有相同名称的 "duplicated" 属性,只保留一个。在上面的示例中,我们有一个类型为 urn:x-ogc:def:phenomenon:Outsmart:1.0:ActivePower
的 ActivePower 和另一个类型为 float
的 ActivePower。假设我们想保留第一个。
首先,停止猎户座和take a backup of the database。如果在编辑实体时出现问题,您可能需要该备份以返回初始状态并重试。
接下来,运行 mongo 控制台(假设您的数据库名为 "orion")并使用 findOne()
操作获取要修改的实体。让我们将它存储在 doc
变量中。
# mongo orion
> doc = db.entities.findOne({"_id.type": "Regulator", "_id.id": "OUTSMART.RG_LAS_LLAMAS_01", "_id.servicePath": "/"})
...
现在,确定要删除的属性在 attrs
数组中的位置,同时考虑向量中第一个元素的位置是 0(而不是 1)。查看上面的示例,要删除的属性是第 7 个。检查打印属性:
> doc.attrs[7]
{
"name" : "ActivePower",
"creDate" : 1393420396,
"value" : "11778.2",
"type" : "float",
"modDate" : 1430092302
}
使用 splice()
函数从 doc
中删除属性,将属性的位置用作第一个参数,将属性的位置用作第二个参数 1. 打印 doc
值以检查它已删除:
> doc.attrs.splice(7, 1)
...
> doc
重复上述操作多次,删除所有重复项(在本例中,只有一个重复项)。完成后,将实体的新版本保存在数据库中:
> db.entities.save(doc)
从 Orion 0.17.0 开始,属性类型不再用作属性 "identification key"。但是,我有使用 0.17.0 之前版本创建的实体,这些实体具有相同名称和不同类型的属性。例如,以下实体有 "ActivePower" 个重复项:
> db.entities.findOne({"_id.type": "Regulator", "_id.id": "OUTSMART.RG_LAS_LLAMAS_01", "_id.servicePath": "/"})
{
"_id" : {
"type" : "Regulator",
"id" : "OUTSMART.RG_LAS_LLAMAS_01",
"servicePath" : "/"
},
"attrs" : [
{
"name" : "TimeInstant",
"value" : "2015-04-27T01:51:36.000000Z",
"type" : "urn:x-ogc:def:trs:IDAS:1.0:ISO8601",
"modDate" : 1430092302
},
{
"name" : "ActivePower",
"value" : "11778",
"type" : "urn:x-ogc:def:phenomenon:Outsmart:1.0:ActivePower",
"modDate" : 1430092302
},
{
"name" : "ReactivePower",
"value" : "8414",
"type" : "urn:x-ogc:def:phenomenon:Outsmart:1.0:ReactivePower",
"modDate" : 1430092302
},
{
"name" : "electricPotential",
"value" : "231",
"type" : "urn:x-ogc:def:phenomenon:IDAS:1.0:electricPotential",
"modDate" : 1430092302
},
{
"name" : "electricCurrent",
"value" : "20890",
"type" : "urn:x-ogc:def:phenomenon:IDAS:1.0:electricCurrent",
"modDate" : 1430092302
},
{
"name" : "Latitud",
"value" : "43.4716987609863",
"type" : "urn:x-ogc:def:phenomenon:IDAS:1.0:latitude",
"modDate" : 1414522843
},
{
"name" : "Longitud",
"value" : "-3.80692005157471",
"type" : "urn:x-ogc:def:phenomenon:IDAS:1.0:longitude",
"modDate" : 1401818472
},
{
"name" : "ActivePower",
"creDate" : 1393420396,
"value" : "11778.2",
"type" : "float",
"modDate" : 1430092302
}
],
"modDate" : 1430092302
}
我如何使该实体适应 Orion 0.17.0 及更高版本?
最简单的解决方案是使用 mongo 控制台编辑实体,删除所有具有相同名称的 "duplicated" 属性,只保留一个。在上面的示例中,我们有一个类型为 urn:x-ogc:def:phenomenon:Outsmart:1.0:ActivePower
的 ActivePower 和另一个类型为 float
的 ActivePower。假设我们想保留第一个。
首先,停止猎户座和take a backup of the database。如果在编辑实体时出现问题,您可能需要该备份以返回初始状态并重试。
接下来,运行 mongo 控制台(假设您的数据库名为 "orion")并使用 findOne()
操作获取要修改的实体。让我们将它存储在 doc
变量中。
# mongo orion
> doc = db.entities.findOne({"_id.type": "Regulator", "_id.id": "OUTSMART.RG_LAS_LLAMAS_01", "_id.servicePath": "/"})
...
现在,确定要删除的属性在 attrs
数组中的位置,同时考虑向量中第一个元素的位置是 0(而不是 1)。查看上面的示例,要删除的属性是第 7 个。检查打印属性:
> doc.attrs[7]
{
"name" : "ActivePower",
"creDate" : 1393420396,
"value" : "11778.2",
"type" : "float",
"modDate" : 1430092302
}
使用 splice()
函数从 doc
中删除属性,将属性的位置用作第一个参数,将属性的位置用作第二个参数 1. 打印 doc
值以检查它已删除:
> doc.attrs.splice(7, 1)
...
> doc
重复上述操作多次,删除所有重复项(在本例中,只有一个重复项)。完成后,将实体的新版本保存在数据库中:
> db.entities.save(doc)