【问题标题】:Mongoose : Update not working猫鼬:更新不起作用
【发布时间】:2014-05-30 06:55:25
【问题描述】:

基本思路是这样的:

model.find({}, function(err, docs) {
    docs.forEach(function(doc) {
        // update it with whatever new object
        model.update({"category":"cat1"});
    });
});

现在我的问题是任何形式的更新/保存都不起作用。我可以使用模型查找、计数等。我试过doc.save()model.findOneAndUpdate(),对特定字段使用$set参数,它们不起作用。我去 mongo shell 并输入带有参数的更新命令,它起作用了。

有一次它确实有效,是当我尝试从find() 的回调函数之外使用var m = new model({..})m.save() 放置新文档时。但我需要按字段查找文档并更新它们。

我觉得我错过了一些非常基本的东西,有人可以帮助我吗?

编辑:mongoose.disconnect() 稍后在代码中被调用。所以查询没有执行。

【问题讨论】:

  • 您确定确实调用了更新函数,例如您是否将console.log() 放在更新上方以便知道该行正在执行?
  • 我做了,在更新功能之外,每个文档的名称都是为了确定。我什至在回调中放了一个 console.log。有趣的是,回调正在执行,但我没有看到它反映在数据库中。

标签: node.js mongodb mongoose


【解决方案1】:

此问题的另一个可能原因是当您使用混合类型时,如Schema.Types.Mixed。如果您只更新 Mixed 字段,则 Mongoose 不知道您已更新该字段。所以你需要拨打markModified

我最近遇到了这个问题,想知道发生了什么让人头疼。

【讨论】:

    【解决方案2】:

    除非它只是一个错字,否则你正在对错误的对象进行更新。你可能想这样做

    model.find({}, function(err, docs) { docs.forEach(函数(文档){ doc.update({/此处的字段/}); }); });

    以上答案不正确。

    编辑

    想了想,你到底为什么要find?没有它,您应该能够更新您的文档。检查API docs for update

    model.update({}, {field1: 'updated value'}, function(err) {});
    

    【讨论】:

    • 没错,但我无法在回调中做到这一点。我将更新代码放在带有一些随机值的 find({}) 回调之外,它工作得很好。在猫鼬中以这种方式更新是不可撤销的吗?我对它还是很陌生。
    • 当我想到它时,您为什么要查找?您应该可以使用正确的参数调用update
    • 因为我正在修改每个文档。例如,doc.value = oldvalue++。所以我想我必须获取每个文档,根据需要进行修改并将新文档推送到数据库中。
    • 啊哈!我开始明白你想要做什么。如果这是您需要的简单添加,请检查 $inc 更新运算符。如果您正在寻找更复杂的计算,似乎有一些work going on
    • 感谢您的帮助,但我终于明白了。不好意思说,但我在函数中调用了 mongoose.disconnect(),所以在查询有机会执行之前,与数据库的连接就被切断了。
    猜你喜欢
    • 2018-05-14
    • 2018-03-03
    • 2017-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-02
    相关资源
    最近更新 更多