【问题标题】:mongoose findOne() call not saving and no error in outputmongoose findOne() 调用不保存且输出没有错误
【发布时间】:2013-12-07 14:48:02
【问题描述】:

我正在做一个简单的 findOne() 并将文档保存在其中,但由于某种原因它不起作用。我已经输出了对象并且控制台中的输出是正确的,但是在save()之后,我看看我的mongodb并没有保存。我不确定是否应该设置某种选项。这是我的代码:

var1 = "data1";
var2 = "data1field1";
Model.findOne({'_id':some_id}).exec(function(err, doc) {
    if (err) return console.error(err);
    (doc.data[var1][var2][0] += 1;
    console.log(doc.data.data1);
    doc.save(function (err) {
        if(err){console.log(err);}
        console.log('success');
    });
});

这是我的架构:

var modelSchema = new mongoose.Schema({
    'data':{
        'data1':{
            'data1field1':[{type: Number}],
            'data1field2':[{type: Number}]
        },
        'data2':{
            'data2field1':[{type: Number}],
            'data2field2':[{type: Number}]
        }
    }
});
var Model = mongoose.model('model', modelSchema);
module.exports.Model = Model;

假设我创建了这个模式的一个实例,其中 data.data1.data1field1 是一个由两个数字 [0,0] 组成的数组,即“console.log(doc.data.data1);”的输出应该是:

{
    data1field1:[1,0],
    data1field2:[0,0] }
success

但是保存没有发生。我是 mongoose/mongodb 的新手,所以我可能缺少一个简单的基础知识。

注意:我不能使用 Model.update({},{$inc {}}) 因为我使用变量来选择要更改的数据对象,并且由于 .update() 中的文字,这是不可能的.

谢谢。

【问题讨论】:

    标签: javascript node.js mongodb find mongoose


    【解决方案1】:

    因此,当您执行简单的属性集(如 myModel.name = 'Steve')时,猫鼬有一些智能可以自动检测更改。但是,当您访问深度嵌套的模式并更改图表深处的属性时,顶级文档无法自动检测到这一点。所以你需要告诉猫鼬你改变了什么。

    doc.markModified('data.' + var1 + '.' + var2);
    

    如果你得到正确的咒语,猫鼬将能够保存你的更改。

    【讨论】:

    • @peter-lyons :在我的场景中,我只更改了直接(第一级)属性。例如, doc.userStatus = "active" 但仍然会出现同样的问题。 :(
    • 即使在调用 doc.markModified("userStatus") 之后它也不起作用。
    • @sincerekamal 请发布一个单独的问题,包括您的代码。
    • 你能告诉我为什么 save 不会在数据库中创建一个新对象,为什么它会更新那个??
    猜你喜欢
    • 2015-01-05
    • 2019-04-29
    • 2020-01-10
    • 1970-01-01
    • 1970-01-01
    • 2013-12-16
    • 2015-08-15
    • 2021-12-04
    相关资源
    最近更新 更多