0

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

MongoDB数据:

这是我的 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
}
});

更新了 MongoDB 数据:

运行脚本后。我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
        }
    ]
}
...
]
4

1 回答 1

1

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

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

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

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}}
    );
})
于 2019-08-28T10:37:23.133 回答