以下是模型定义:
pricing: { type: Number, default: null }
当Mongoose尝试更新源数据为null的记录时,这是我得到的异常:
我收到错误消息:
message: 'Cast to number failed for value "NaN" at path "pricing"',
name: 'CastError',
type: 'number',
value: NaN,
path: 'pricing'
我确实需要在这种情况下使用null更新现有值,因为应用程序将该字段视为可以为空的Number字段。
如何解决?提前谢谢!
答案 0 :(得分:0)
我的猜测是它正试图将null
投射到Number
。尝试将default
设置为0
;
答案 1 :(得分:0)
为定价插入空值似乎对我有用;请参阅我在下面使用的示例代码:
app.js
var mongoose = require("mongoose"),
Widget = require("./model.js").model;
// connect to mongo
mongoose.connect("mongodb://localhost/testdb");
// test insertion
var testValid = new Widget({ name: "Valid Test", price: 10.00 }),
testInvalid = new Widget({ name: "Invalid Test", price: null });
testValid.save();
testInvalid.save(function (err) {
if (err) {
console.log(err);
}
});
model.js
var mongoose = require("mongoose");
var schema = new mongoose.Schema({
name: String,
price: { type: Number, default: null }
});
exports.model = mongoose.model("Widget", schema);
exports.schema = schema;
根据您的错误消息判断,似乎正在进行无效计算,其结果是尝试插入Mongo。错误消息中的“值”是尝试插入的值。您可以通过尝试保存以下文档来验证这一点:
var testInvalid = new Widget({ name: "Invalid Test", price: "abc"});
这将导致:
{ message: 'Cast to number failed for value "abc" at path "price"',
name: 'CastError',
type: 'number',
value: 'abc',
path: 'price' }
您可以分享更多详细信息或代码示例吗?
修改强>
我会尝试从其余代码中隔离更新,看看是否可以复制错误,如下所示:
var mongoose = require("mongoose"),
Widget = require("./model.js").model;
// connect to mongo
mongoose.connect("mongodb://localhost/testdb");
// insert record
var testInvalid = new Widget({ name: "Invalid Test", price: 10.00 });
// update record
testInvalid.save(function (err) {
if (err) {
console.log(err);
} else {
Widget.findOne({ name: "Invalid Test" }, function (err, record) {
// set price to null & save
record.price = null;
record.save(function (err) {
if (err) {
console.log(err);
}
});
});
}
});
这个孤立的更新似乎对我有用。对不起,我无法提供更多帮助:/
答案 2 :(得分:0)
NaN!= null是描述问题的最佳方式。 您应该检查您要为“NaN”插入的价格的值。 如果此测试为true,则在文档中插入null,否则插入正确解析的定价(作为数字)。