Ошибка при запросе FIWARE Orion с пользовательским атрибутом orderBy - PullRequest
0 голосов
/ 15 октября 2018

Я сталкиваюсь со следующей проблемой, когда запрашиваю Orion с помощью orderBy и запрашиваю результаты в хронологическом порядке.Мои данные выглядят так:

{
    "id": "some_unique_id",
    "type": "sensor",
    "someVariable": {
        "type": "String",
        "value": "1",
        "metadata": {}
    },
    "datetime": {
        "type": "DateTime",
        "value": "2018-09-21T00:38:57.00Z",
        "metadata": {}
    },
    "humidity": {
        "type": "Float",
        "value": 55.9,
        "metadata": {}
    },
    "someMoreVariables": {
        "type": "Float",
        "value": 6.29,
        "metadata": {}
    }

Мой звонок выглядит так:

http://my.ip.com:1026/v2/entities?type=sensor&offset=SOMENUMBERMINUS30&limit=30&orderBy=datetime

К сожалению, ответ следующий:

{
"error": "InternalServerError",
"description": "Error at querying MongoDB"}

И арендатор, исубтенданты используются в вызове, в то время как версия Orion 1.13.0-следующая и арендатор был проиндексирован внутри MongoDB.Я использую Orion и MongoDB из разных экземпляров Docker на одном сервере.Как всегда, любая помощь будет высоко оценена.

EDIT1 : После рекомендации fgalan я добавляю относительную запись из журнала (извините, я не сделал это изначало):

BadInput some.ip time = 2018-10-16T07: 47: 36.576Z |lvl = ОШИБКА |corr = bf8461dc-d117-11e8-b0f1-0242ac110003 |транс = 1539588749-153-00000013561 |from = some.ip |srv = some_tenant |subsrv = / some_subtenant |comp = Orion |op = AlarmManager.cpp [211]: dbError |msg = Срабатывание тревоги DatabaseError: nextSafe (): {$ err: "Ошибка исполнителя: OperationFailed: Операция сортировки использовала более 33554432 байт оперативной памяти. Добавьте индекс или укажите меньший предел.", код: 17144} time =2018-10-16T07: 47: 36,576Z |lvl = ОШИБКА |corr = bf8461dc-d117-11e8-b0f1-0242ac110003 |транс = 1539588749-153-00000013561 |from = some.ip |srv = some_tenant |subsrv = / some_subtenant |comp = Orion |op = AlarmManager.cpp [235]: dbErrorReset |msg = Сброс тревоги DatabaseError

Из вышесказанного ясно, что индексация необходима.Я уже сделал это в соответствии с ответом Фгалана на другой вопрос, который у меня был в прошлом: Индексирование Ориона

РЕДАКТИРОВАНИЕ2 : Ответ Ориона после индексации:

[
    {
            "v" : 2,
            "key" : {
                    "_id" : 1
            },
            "name" : "_id_",
            "ns" : "orion.entities"
    },
    {
            "v" : 2,
            "key" : {
                    "location.coords" : "2dsphere"
            },
            "name" : "location.coords_2dsphere",
            "ns" : "orion.entities",
            "2dsphereIndexVersion" : 3
    },
    {
            "v" : 2,
            "key" : {
                    "creDate" : 1
            },
            "name" : "creDate_1",
            "ns" : "orion.entities"
    }
]

1 Ответ

0 голосов
/ 16 октября 2018

У вас есть индекс {creDate: 1}, который подходит, если вы упорядочиваете по дате создания объекта, используя dateCreated (или не указываете параметры orderBy, так как дата создания является порядком по умолчанию):

GET /v2/entities
GET /v2/entities?orderBy=dateCreated

Однако, если вы планируете упорядочить по другому определенному вами атрибуту (как я понимаю datetime is) и получите ошибку OperationFailed: Sort operation used more than the maximum, то вам нужно создать индекс для значения такого атрибута.В частности, вы должны создать этот индекс:

{ attrs.datetime.value: 1 }

РЕДАКТИРОВАТЬ: , как предлагается в комментарии к этому ответу, команда для создания вышеуказанного индекса, как правило, выглядит так:

db.entities.createIndex({"attrs.datetime.value": 1});

РЕДАКТИРОВАТЬ2: см. этот раздел документации для получения более подробной информации по этому виду индексов.

...