MongoDB строка в int - PullRequest
       19

MongoDB строка в int

0 голосов
/ 29 января 2019

Я хочу преобразовать строку поля значения MongoDB в целые числа, а затем вычислить среднее значение.

Это мой JSON:

"_id" : ObjectId("5c49f398fc0078178c76705b"),     // my json data
    "Time_Created" : ISODate("2019-01-24T17:19:20.205Z"),   // date
    "Test_ID" : "1",
    "data" : [
        {
            "Device_id" : "1",
            "Total_wires" : "5",
            "Cables" : [
                {
                    "TAG" : "4001",
                    "Value" : "24.3"
                },
                {
                    "TAG" : "4002",
                    "Value" : "21.3"
                },
                {
                    "TAG" : "4003",
                    "Value" : "21.3"
                },
                {
                    "TAG" : "4004",
                    "Value" : "21.3"
                },                                                            
                {
                    "TAG" : "4005",                                        
                    "Value" : "100.3"
                }
            ]
        }
    ]
}

Я использую следующий запрос для извлечениясредние значения

  1. Запрос:

    db.collection_name.aggregate( [{  '$project': { 'values': '$data.Cables.Value', }}, { '$unwind': '$values' }, { '$addFields': { 'avgValue': { '$avg': { $toInt: '$values' } }  } } ] )
    

    Но я получаю эту ошибку:

    2019-01-29T11: 06: 05.642-0800 E QUERY [js] Ошибка: команда не выполнена:
    {
    "ok": 0,
    "errmsg": "Неподдерживаемое преобразование из массива в int в $ convert
    без значения onError",
    "code": 241,
    "codeName": "ConversionFailure"
    }: сбой агрегата:
    _getErrorWithCode@src/mongo/shell/utils.js: 25: 13
    doassert @src / mongo / shell / assert.js: 18: 14
    _assertCommandWorked@src/mongo/shell/assert.js: 534: 17
    assert.commandWorked@src/mongo/shell/assert.js: 618:16
    DB.prototype._runAggregate@src/mongo/shell/db.js: 260: 9
    DBCollection.prototype.aggregate@src/mongo/shell/collection.js: 1062: 12
    @ (оболочки): 1: 1

  2. Я тоже триed следующее:

    db.collection_name.aggregate( 
    [{  '$project': { 'values': '$data.Cables.Value', }}, 
      { '$unwind': '$values' }, 
      { '$addFields': { 'avgValue': { '$avg': { 'input': '$values', 'to': 
      'int' } }  } } 
    ] )
    

    Но я также получаю этот вывод:

    {"_id": ObjectId ("5c509604fc007808c427edcb"), "values":
    ["24.3", "23.3", "25.3", "31.3", "90.3"], "avgValue": null}

Ожидаемое значение должно быть среднимполей значений.
Мне нужно какое-то преобразование для вложенных значений документа.

Значение входящей строки необходимо преобразовать в целые или десятичные числа, а затем рассчитать среднее его значение.

Это затем используется в коде C # для генерации конвейера

var pipeline = new[] 
{ 
  project, unwind, addfields 
};

1 Ответ

0 голосов
/ 30 января 2019

Используйте toDouble вместо toInt, потому что ваши значения не являются целыми числами.Попробуйте следующие этапы.

[
    {
        '$project': {
            'values': '$data.Cables.Value'
        }
    }, {
        '$unwind': {
            'path': '$values'
        }
    }, {
        '$project': {
            'values': {
                '$map': {
                    'input': '$values', 
                    'as': 'value', 
                    'in': {
                        '$toDouble': '$$value'
                    }
                }
            }
        }
    }, {
        '$addFields': {
            'avgValue': {
                '$avg': '$values'
            }
        }
    }
]
...