gpt4 book ai didi

mongodb - 如何更改 Mongo 文档中嵌套字段的数据类型?

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

我的 Mongo 结构如下,

"topProcesses" : [
{
"cpuUtilizationPercent" : "0.0",
"processId" : "1",
"memoryUtilizationPercent" : "0.1",
"command" : "init",
"user" : "root"
},
{
"cpuUtilizationPercent" : "0.0",
"processId" : "2",
"memoryUtilizationPercent" : "0.0",
"command" : "kthreadd",
"user" : "root"
},
{
"cpuUtilizationPercent" : "0.0",
"processId" : "3",
"memoryUtilizationPercent" : "0.0",
"command" : "ksoftirqd/0",
"user" : "root"
},
{
"cpuUtilizationPercent" : "0.0",
"processId" : "5",
"memoryUtilizationPercent" : "0.0",
"command" : "kworker/0:+",
"user" : "root"
},
{
"cpuUtilizationPercent" : "0.0",
"processId" : "6",
"memoryUtilizationPercent" : "0.0",
"command" : "kworker/u3+",
"user" : "root"
},
{
"cpuUtilizationPercent" : "0.0",
"processId" : "8",
"memoryUtilizationPercent" : "0.0",
"command" : "rcu_sched",
"user" : "root"
}
]

现在在上面的文档中 topProcesses.cpuUtilizationPercent 是字符串,我想将 topProcesses.cpuUtilizationPercent 数据类型更改为 Float。为此,我在下面尝试过,但没有成功

db.collectionName.find({
"topProcesses":{"$exists":true}}).forEach(function(data){
for(var ii=0;ii<data.topProcesses.length;ii++){
db.collectionName.update({_id: data._id},{$set:{"topProcesses.$.cpuUtilizationPercent":parseFloat(data.topProcesses[ii].cpuUtilizationPercent)}},false,true);
}
})

任何人都可以帮助如何将字符串更改为在嵌套的 Mongo 文档中 float

最佳答案

您这样做是正确的,但您没有在 .update() 的查询部分中包含要匹配的数组元素:

db.collectionName.find({
"topProcesses":{"$exists":true}}).forEach(function(data){
for(var ii=0;ii<data.topProcesses.length;ii++) {
db.collectionName.update(
{
"_id": data._id,
"topProcesses.processId": data.topProcesses[ii].processId // corrected
},
{
"$set": {
"topProcesses.$.cpuUtilizationPercent":
parseFloat(data.topProcesses[ii].cpuUtilizationPercent)
}
}
);
}
})

因此,您需要匹配数组中的某些内容才能获得 positional $运算符有任何作用。

您也可以只使用符号中的“索引”值,因为无论如何您都是在循环中生成它:

db.collectionName.find({
"topProcesses":{"$exists":true}}).forEach(function(data){
for(var ii=0;ii<data.topProcesses.length;ii++) {

var updoc = {
"$set": {}
};

var myKey = "topProcesses." + ii + ".cpuUtilizationPercent";
updoc["$set"][myKey] = parseFloat(data.topProcesses[ii].cpuUtilizationPercent);

db.collectionName.update(
{
"_id": data._id
},
updoc
);
}
})

仅使用匹配索引,在没有数组元素唯一标识符的情况下很方便。

另请注意,由于处理现有文档的方式的性质,此处不应使用“upsert”或“multi”选项。


正如对此的“附注”一样,考虑 2.6 及更高版本中 MongoDB 的批量操作 API 也是值得的。使用这些 API 方法,您可以显着减少客户端应用程序和数据库之间的网络流量。这里明显的改进在于整体速度:

var bulk = db.collectionName.initializeOrderedBulkOp();
var counter = 0;

db.collectionName.find({
"topProcesses":{"$exists":true}}
).forEach(function(data){
for(var ii=0;ii<data.topProcesses.length;ii++) {

var updoc = {
"$set": {}
};

var myKey = "topProcesses." + ii + ".cpuUtilizationPercent";
updoc["$set"][myKey] = parseFloat(data.topProcesses[ii].cpuUtilizationPercent);

// queue the update
bulk.find({ "_id": data._id }).update(updoc);
counter++;

// Drain and re-initialize every 1000 update statements
if ( counter % 1000 == 0 ) {
bulk.execute();
bulk = db.collectionName.initializeOrderedBulkOp();
}
}
})

// Add the rest in the queue
if ( counter % 1000 != 0 )
bulk.execute();

这基本上将发送到服务器的操作语句数量减少到每 1000 个排队操作仅发送一次。您可以使用该数字以及事物的分组方式,但它会以相对安全的方式显着提高速度。

关于mongodb - 如何更改 Mongo 文档中嵌套字段的数据类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27498872/

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