Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 用浮点值替换字符串值_Mongodb - Fatal编程技术网

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是的,你可以:)。告诉我如何执行更新查询?