修复由于 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)