MongoDB聚合运算符:$toDecimal
文章目录
$toDecimal
聚合运算符将指定的值转换为Decimal类型。如果指定的值为空或缺失,则返回null;如果值无法被转换为Decimal,则报错。
语法
js
{
$toDecimal: <expression>
}
$toDecimal
接受任何有效的表达式。
$toDecimal
是$convert
表达式的简写形式:
js
{ $convert: { input: <expression>, to: "Decimal" } }
使用
下表列出了可转换为布尔值的类型:
输入类型 | 规则 |
---|---|
Boolean | 对于True,返回Decimal128("1") ,对于False返回Decimal128("0") |
Double | 以Decimal返回Double的值 |
Decimal | 原样返回 |
Integer | 以Decimal返回整数值 |
Long | 以Decimal返回Long值 |
String | 将字符串转换为Decimal返回,但字符串表示的必须是10进制的比如"-5.5"、"1233",非10进制的会报错,如:"0x3343" |
Date | 返回自与日期值对应的纪元以来的毫秒数 |
下表列出了一些转换为布尔值的示例:
示例 | 结果 |
---|---|
{$toDecimal: true} |
Decimal128("1") |
{$toDecimal: false} |
Decimal128("0") |
{$toDecimal: 2.5} |
Decimal128("2.50000000000000") |
{$toDecimal: NumberInt(5)} |
Decimal128("5") |
{$toDecimal: NumberLong(10000)} |
Decimal128("10000") |
{$toDecimal: "-5.5"} |
Decimal128("-5.5") |
{$toDecimal: ISODate("2018-03-27T05:04:47.890Z")} |
Decimal128("1522127087890") |
举例
使用下面的脚本创建orders
集合:
js
db.orders.insertMany( [
{ _id: 1, item: "apple", qty: 5, price: 10 },
{ _id: 2, item: "pie", qty: 10, price: NumberDecimal("20.0") },
{ _id: 3, item: "ice cream", qty: 2, price: "4.99" },
{ _id: 4, item: "almonds", qty: 5, price: 5 }
] )
下面的聚合操先orders
集合的price
转换为decimal,qty
转换为整数,然后计算总费用:
js
// 定义转换阶段,转换后的price和qyt字段convertedPrice和convertedQty添加到文档
priceQtyConversionStage = {
$addFields: {
convertedPrice: { $toDecimal: "$price" },
convertedQty: { $toInt: "$qty" },
}
};
//定义计算合计阶段,将convertedPrice和convertedQty相乘得到总计
totalPriceCalculationStage = {
$project: { item: 1, totalPrice: { $multiply: [ "$convertedPrice", "$convertedQty" ] } }
};
db.orders.aggregate( [
priceQtyConversionStage,
totalPriceCalculationStage
] )
执行的结果为:
js
{ _id: 1, item: 'apple', totalPrice: Decimal128("50") },
{ _id: 2, item: 'pie', totalPrice: Decimal128("200.0") },
{ _id: 3, item: 'ice cream', totalPrice: Decimal128("9.98") },
{ _id: 4, item: 'almonds', totalPrice: Decimal128("25") }