Mongodb 用浮点值替换字符串值
我的数据结构如下所示:Mongodb 用浮点值替换字符串值,mongodb,Mongodb,我的数据结构如下所示: { customer: 10000001, metadata: { foo: '10.4', bar: 99 } } 不幸的是,我的数据集中有一个错误,'metadata.foo'的所有值都存储为字符串。有500个受影响的文档(该值是可选的),因此无法手动更正这些值 如果终端存在字符串值,而不执行一些JavaScript代码,是否可以用其浮点值替换该字符串值 我在想这样的事情: db.collection.upda
{
customer: 10000001,
metadata: {
foo: '10.4',
bar: 99
}
}
不幸的是,我的数据集中有一个错误,'metadata.foo'
的所有值都存储为字符串。有500个受影响的文档(该值是可选的),因此无法手动更正这些值
如果终端存在字符串值,而不执行一些JavaScript代码,是否可以用其浮点值替换该字符串值
我在想这样的事情:
db.collection.update(
{
'metadata.foo': { $exists: true }
},
{
$toDecimal: <expression??>
}
)
db.collection.update(
{
'metadata.foo':{$exists:true}
},
{
$toDecimal:
}
)
试试这个:
db.collection.update(
{
'metadata.foo': { $exists: true, $type:"string" }
},
[{
$set:{"metadata.foo" : {$toDouble:"$metadata.foo"}}
}],
{multi:true}
)
我假设您有MongoDB v4.2
对于MongoDB早期的v4.2,MongoDB不允许通过读取自身来覆盖值
漫游#1:
db.collection.aggregate([
{
$match:{'metadata.foo': { $exists: true, $type:"string" }}
},
{
$addFields:{"metadata.foo" : {$toDouble:"$metadata.foo"}}
}
]).forEach(function(doc){
db.collection.save(doc);
})
演练#2:替换,
至
:
db.collection.find({
$match:{'metadata.foo': { $exists: true, $type:"string" }}
}).forEach(function(doc){
doc.metadata.foo = parseFloat(doc.metadata.foo.replace(",","."));
db.collection.save(doc);
})
我使用的是v4.0。只有一个问题:我如何处理像
'10,5'
这样的字符串值,这些值应该作为10.5
处理?@user3142695请稍等片刻,但您的解决方法不能直接在终端中使用,对吗?所以我想我会升级到v4。2@user3142695是的,你可以:)。告诉我如何执行更新查询?