gpt4 book ai didi

MongoDb - 将类型从 Int 更改为 Double

转载 作者:IT老高 更新时间:2023-10-28 13:26:09 26 4
gpt4 key购买 nike

我们有一个如下所示的集合:

{
"_id" : "10571:6",
"v" : 261355,
"ts" : 4.88387e+008
}

现在,有些“v”是整数,有些是 double 。我想把它们都改成 double 。

我尝试了一些方法,但没有任何效果(v 是该记录的 int32,我想将其更改为 double ):

db.getCollection('VehicleLastValues')
.find
(

{_id : "10572:6"}
)
.forEach
(
function (x)
{
temp = x.v * 1.0;
db.getCollection('VehicleLastValues').save(x);
}}

我尝试过的事情:

x.v = x.v * 1.1 / 1.1;
x.v = parseFloat (new String(x.v));

但我无法将其保存为 double ...

最佳答案

默认情况下,所有“数字”在 MongoDB 中都存储为“double”,除非通常过度转换。

采取以下样本:

db.sample.insert({ "a": 1 })
db.sample.insert({ "a": NumberLong(1) })
db.sample.insert({ "a": NumberInt(1) })
db.sample.insert({ "a": 1.223 })

这会产生一个这样的集合:

{ "_id" : ObjectId("559bb1b4a23c8a3da73e0f76"), "a" : 1 }
{ "_id" : ObjectId("559bb1bba23c8a3da73e0f77"), "a" : NumberLong(1) }
{ "_id" : ObjectId("559bb29aa23c8a3da73e0f79"), "a" : 1 }
{ "_id" : ObjectId("559bb30fa23c8a3da73e0f7a"), "a" : 1.223 }

尽管构造函数不同,但请注意那里的几个数据点看起来非常相似。 MongoDB shell 本身并不总是清楚地区分它们,但有一种方法可以分辨。

当然有 $type查询运算符,允许选择 BSON 类型。

所以使用类型 1 进行测试 - 这是“双”:

> db.sample.find({ "a": { "$type": 1 } })
{ "_id" : ObjectId("559bb1b4a23c8a3da73e0f76"), "a" : 1 }
{ "_id" : ObjectId("559bb30fa23c8a3da73e0f7a"), "a" : 1.223 }

您会看到第一个插入和最后一个插入都被选中,但当然不是其他两个。

所以现在测试 BSON 类型 16 - 这是一个 32 位整数

> db.sample.find({ "a": { "$type": 16 } })
{ "_id" : ObjectId("559bb29aa23c8a3da73e0f79"), "a" : 1 }

这是在 shell 中使用 NumberInt() 函数的“第三次”插入。这样您的驱动程序中的函数和其他序列化就可以设置这个特定的 BSON 类型。

对于 BSON 类型 18 - 它是 64 位整数

> db.sample.find({ "a": { "$type": 18 } })
{ "_id" : ObjectId("559bb1bba23c8a3da73e0f77"), "a" : NumberLong(1) }

通过 NumberLong() 构造的“第二次”插入。

如果你想“清除”那些“不是双重”的东西,那么你会这样做:

db.sample.find({ "$or": [{ "a": { "$type": 16 } },{ "a": { "$type": 18 } }]})

除了“double”本身之外,还有哪些其他有效的数字类型。

所以要“转换”您的收藏中的这些,您可以像这样“批量”处理:

var bulk = db.sample.initializeUnorderedBulkOp(),
count = 0;
db.sample.find({
"$or": [
{ "a": { "$type": 16 } },
{ "a": { "$type": 18 } }
]
}).forEach(function(doc) {
bulk.find({ "_id": doc._id })
.updateOne({
"$set": { "b": doc.a.valueOf() } ,
"$unset": { "a": 1 }
});
bulk.find({ "_id": doc._id })
.updateOne({ "$rename": { "b": "a" } });
count++;
if ( count % 1000 == 0 ) {
bulk.execute()
bulk = db.sample.initializeUnOrderedBulkOp();
}
})
if ( count % 1000 != 0 ) bulk.execute();

所做的工作分三个步骤“批量”执行:

  1. 将值重新转换为“ double ”字段
  2. 删除不需要类型的旧字段
  3. 将新字段重命名为旧字段名称

这是必要的,因为 BSON 类型信息一旦创建就“粘”到字段元素。因此,为了“重铸”,您需要完全删除包含原始字段分配的旧数据。

这应该解释如何“检测”和“重新转换”文档中不需要的类型。

关于MongoDb - 将类型从 Int 更改为 Double,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31265079/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com