Мои данные :
[
{ 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.
значение — это новое поле, созданное на этапе $project.
О, извините, это была ошибка. Исправлено сейчас.

тл;др
$toLong:"$total" (отсюда)Двойники преобразуются в экспоненциальное представление, и это учитывается при измерении длины строки, которая равна 9 в большинстве или во всех полях. Как вы сказали, тип этих чисел двойной.
См. рабочий пример здесь, конвертируя строку в число перед обрезанием данных:
db.collection.aggregate({
$addFields: {
length: {
$multiply: [
{
$add: [
{
$strLenCP: {
$toString: {
$toLong: "$total"
},
}
},
-2
]
},
-1
]
},
}
},
{
$project: {
value: {
$toLong:{
$trunc: [
"$total",
"$length"
],
}
},
_id: 0,
}
})
Деталь
$toInt, потому что числа большие. Большой больше, чем 10^10
Потому что $trunc принимает отрицательное число. Пример: trunc(125, -1) = 120. Этот конвейер хорошо работает для многих данных int32. Я не знаю, почему это не работает с каким-то двойным форматом