1

这是模型定义:

pricing: { type: Number, default: null }

这是当 Mongoose 尝试更新源数据为空的记录时遇到的异常:

我得到的错误信息:

  message: 'Cast to number failed for value "NaN" at path "pricing"',
     name: 'CastError',
     type: 'number',
    value: NaN,
     path: 'pricing'

对于这种情况,我确实需要用 null 更新现有值,因为应用程序将该字段视为可以为空的 Number 字段。

如何解决?提前致谢!

4

3 回答 3

0

为定价插入空值对我来说似乎没问题;请参阅下面我使用的示例代码:

应用程序.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);
    }
});

模型.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);
                }
            });
        });
    }
});

这个孤立的更新似乎对我有用。抱歉,我无法提供更多帮助:/

于 2013-04-09T22:22:08.017 回答
0

我的猜测是它正在尝试转换nullNumber. 尝试设置default0;

于 2013-04-09T20:57:05.030 回答
0

NaN != null 是描述问题的最佳方式。您应该检查您尝试为“NaN”插入的价格值。如果此测试为真,则在您的文档中插入空值,否则插入正确解析的定价(作为数字)。

于 2015-01-16T13:42:59.453 回答