我的数据:
[
{ 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.0000.0000的数据是双倍的,而不是int32编辑2:它与";24760000000";但不是用";25661674539";。我真的不明白为什么。它们以Double格式存储。
tl;dr
- 添加
$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
将这些大数字转换为int,因为这些数字很大。大于10^10
的大型