首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在MongoDB shell中将NumberDecimal转换为Double?

如何在MongoDB shell中将NumberDecimal转换为Double?
EN

Stack Overflow用户
提问于 2019-07-04 11:27:25
回答 1查看 5.9K关注 0票数 2

我有一个文档,其中的“NumberDecimal”被归档为测试类型

代码语言:javascript
运行
复制
{ "_id" : ObjectId("5d1a202e476381c30cd995a4"),  "test" : NumberDecimal("0.1") }

如何在mongodb shell中将测试字段从NumberDecimal转换为Double

我试着执行

代码语言:javascript
运行
复制
db.collection.find({"test": {$exists: true}}).forEach(function (x) {   x.test = parseFloat(x.test);   db.collection.save(x); });

但是不要解决这个问题,因为它返回NaN

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-05 10:38:00

decimal类型不是JavaScript的原生类型,因此shell中的BSON值是表示存储在MongoDB中的NumberDecimal值的特殊包装器。如果要使用parseFloat(),可以将NumberDecimal转换为JSON以访问字符串值。例如,在您的原始代码中,这将是:parseFloat(x.test.toJSON()["$numberDecimal"])

但是,更好的方法是使用聚合框架来处理十进制值,包括算术运算(MongoDB 3.4+)和类型转换(MongoDB 4.0+)。

MongoDB 4.0+包含一个将数值(十进制、整型、长整型、布尔型、日期型、字符串)转换为双精度型的$toDouble() expressionMongoDB 4.0中的聚合框架不能用于更新文档(除非您希望使用$out创建新集合或替换现有集合),因此您必须运行聚合查询来转换值,然后单独应用文档更新:

代码语言:javascript
运行
复制
// Find matching documents
var docs = db.collection.aggregate([
    { $match: {
        test: { $exists: true }
    }},

    // Add a new field converting the decimal to a double
    // (alternatively, the original "test" value could also be replaced)
    { $addFields: {
        testDouble: { $toDouble: "$test" }
    }}
])

// Update with the changes (Note: this could be a bulk update for efficiency)
docs.forEach(function (doc) {
     db.collection.update({ _id: doc._id}, {$set: { testDouble: doc.testDouble }});
});

// Check the results
> db.collection.find().limit(1)
{
    "_id" : ObjectId("5d1a202e476381c30cd995a4"),
    "test" : NumberDecimal("0.1"),
    "testDouble" : 0.1
}

MongoDB 4.2 (目前在RC中)增加了对使用一些aggregation stages for updates的支持,因此在4.2中,上面的更新可以更简洁地表达为:

代码语言:javascript
运行
复制
db.collection.updateMany(
    { test: { $exists: true }},
    [ { $addFields: { testDouble: { $toDouble: "$test" }}}]
)
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56880268

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档