MongoDB - 将嵌套数组中的数据类型从字符串更新为数字不起作用

MongoDB - Updating datatype in nested array for String to Number not working

我尝试更新 MongoDB 嵌套数组数据类型,它更新了 NaN 值。你能帮帮我吗,任何人。谢谢

Mongo数据库数据:

这是我的 MongoDB 数据 productqtydetails 集合。

[{
    "_id" : ObjectId("5d31567ea23d120f087a9ab1"),
    "productId" : ObjectId("5d31567ea23d120f087a9aaf"),
    "sizes" : [ 
        {
            "name" : "4",
            "qty" : 3.0,
            "price" : "1500.0"
        }, 
        {
            "name" : "5",
            "qty" : 6.0,
            "price" : "1600.0"
        }, 
        {
            "name" : "6",
            "qty" : 7.0,
            "price" : "1700.0"
        }
    ]
}
....
]

Mongo Shell 脚本:

db.productqtydetails.update({
    _id : ObjectId("5d31567ea23d120f087a9ab1")
    },
{
    $set: {"sizes.$[].price": parseFloat("$sizes.$[].price") //Here I used parseInt(), NumberInt also
}
});

已更新Mongo数据库数据:

在 运行 脚本之后。我收到 price : NaN 它已更新。

[{
    "_id" : ObjectId("5d31567ea23d120f087a9ab1"),
    "productId" : ObjectId("5d31567ea23d120f087a9aaf"),
    "sizes" : [ 
        {
            "name" : "4",
            "qty" : 3.0,
            "price" : NaN
        }, 
        {
            "name" : "5",
            "qty" : 6.0,
            "price" : NaN
        }, 
        {
            "name" : "6",
            "qty" : 7.0,
            "price" : NaN //need to update "price" : 1700.0
        }
    ]
}
...
]

首先,parseFloat 是一个 javascript 函数而不是 MongoDB 运算符。意味着您可以在脚本中使用它,但不能在 MongoDB query/command.

中使用

其次,更新命令不能有自引用(意味着您不能使用同一文档的 same/different 字段更新文档中的字段)。

简而言之,您不能在单个查询中执行此操作。您需要两个查询,第一个是获取,第二个是更新。

db.productqtydetails.find({_id : ObjectId("5d31567ea23d120f087a9ab1")}).forEach(function(data) {
    var sizes = data.sizes;
    for(var i = 0; i < sizes.length; i++) {
        sizes[i]["price"] = parseFloat(sizes[i]["price"]);
    }

    db.productqtydetails.update(
        {"_id": data._id},
        {"$set": {"sizes": sizes}}
    );
})