【问题标题】:Mongoose updates a field with null value throws exceptionMongoose 用空值更新字段抛出异常
【发布时间】:2013-04-09 19:22:31
【问题描述】:

这是模型定义:

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 更新现有值,因为应用程序将该字段视为可以为 null 的数字字段。

如何解决?提前致谢!

【问题讨论】:

  • 我认为 Mongoose 和 MongoDB 2.6 不再是这个问题。我不确定它什么时候被修复,但我用空值测试了model.create(),用空值测试了架构默认值,用空值测试了doc.save(),所有这些都正确插入,find() 那个空值。跨度>

标签: node.js mongoose


【解决方案1】:

我的猜测是它试图将null 转换为Number。尝试将default 设置为0;

【讨论】:

  • 谢谢。我试过了。它不起作用。我更新了收到的错误消息。
【解决方案2】:

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

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);
                }
            });
        });
    }
});

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

【讨论】:

  • 感谢您的回复。插入是好的,但不更新。我使用 findOne 来获取文档并将其中一个字段分配为 null,然后调用 save()。我收到了那个错误信息。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-21
    • 1970-01-01
    • 1970-01-01
    • 2022-11-16
    • 1970-01-01
    • 1970-01-01
    • 2017-09-02
    • 2012-09-09
    相关资源
    最近更新 更多