MongoDb — справка для конвейера с $trunc

Мои данные :

[
    { total: 7421356 }, 
    { total: 79421356 },
    { total: 105457854 },
    { total: 1054578540 },
    { total: 10545785400 },
]

Я хотел бы иметь что-то вроде:

[
    { val: 7000000, count 1 },
    { val: 70000000, count 1 },
    { val: 100000000, count: 1 },
    { val: 1000000000, count 1 }
]

На самом деле я использую этот конвейер:

{
    $addFields: {
        length: {
            $multiply: [
                {
                    $add: [
                        {
                            $strLenCP: {
                                $toString: "$val",
                            }
                        },
                        -1
                    ]
                },
                -1
            ]
        },
    },
},
{
    $project: {
        value: {
            $trunc: ["$val", "$length"],
        },
        _id: 0,
    }
},
{
    $group: {
        _id: "$value",
        count: {
            $sum: 1
        }
    }
}, 
{
    $project: {
        value: "$_id",
        count: 1, 
        _id: 0,
    }
},
{
    $sort: {
        value: 1
    }
}

У меня проблема, когда у меня есть данные типа "10545785400". Кажется, его длина слишком велика, и для моих данных «7421356» его результат теперь равен «0».

Я думал, что документы проходят конвейер по отдельности, но, похоже, это не так. Мои первые данные, кажется, используют длину моего последнего.

Я надеюсь, что кто-то может мне помочь, даже если мои объяснения не очень ясны.

Обновлено: Кажется, это проблема «типа». Данные с числом больше 1.000.000.000 являются двойными, а не int32 Обновлено еще раз: он работает с «24760000000», но не с «25661674539». Я действительно не понимаю, почему. Они хранятся в формате Double.

Потому что $trunc принимает отрицательное число. Пример: trunc(125, -1) = 120. Этот конвейер хорошо работает для многих данных int32. Я не знаю, почему это не работает с каким-то двойным форматом

Flo flo 15.12.2020 16:18

значение — это новое поле, созданное на этапе $project.

Flo flo 15.12.2020 16:26

О, извините, это была ошибка. Исправлено сейчас.

Flo flo 15.12.2020 16:39
Использование JavaScript и MongoDB
Использование JavaScript и MongoDB
Сегодня я собираюсь вкратце рассказать о прототипах в JavaScript, а также представить и объяснить вам работу с базой данных MongoDB.
1
3
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

тл;др


Двойники преобразуются в экспоненциальное представление, и это учитывается при измерении длины строки, которая равна 9 в большинстве или во всех полях. Как вы сказали, тип этих чисел двойной.

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

db.collection.aggregate({
  $addFields: {
    length: {
      $multiply: [
        {
          $add: [
            {
              $strLenCP: {
                $toString: {
                  $toLong: "$total"
                },
                
              }
            },
            -2
          ]
        },
        -1
      ]
    },
    
  }
},
{
  $project: {
    value: {
      $toLong:{
        $trunc: [
        "$total",
        "$length"
      ],
      }
    },
    _id: 0,
    
  }
})

Деталь

  • Вы не можете преобразовать эти большие числа в int, используя $toInt, потому что числа большие. Большой больше, чем 10^10

Другие вопросы по теме