如何在mongoose中更新多个文档

pky*_*eck 49 mongoose mongodb node.js

我找到了以下脚本:

Device.find(function(err, devices) {
  devices.forEach(function(device) {
    device.cid = '';
    device.save();
  });
});
Run Code Online (Sandbox Code Playgroud)

MongoDB有多个文件更新的"多"标志,但我无法使用mongoose.这还不支持还是我做错了什么?!

Device.update({}, {cid: ''}, false, true, function (err) {
  //...
});
Run Code Online (Sandbox Code Playgroud)

kcb*_*ner 77

目前我认为update()在Mongoose有一些问题,请参阅:https: //groups.google.com/forum/#%21topic/mongoose-orm/G8i9S7E8Erghttps://groups.google.com/d/topic/mongoose- orm/K5pSHT4hJ_A /讨论.

但是,请查看文档以获取更新:http://mongoosejs.com/docs/api.html(在模型下).定义是:

早期解决方案(在mongoose 5+版本之后折旧)

Model.update = function (query, doc, options, callback) { ... }
Run Code Online (Sandbox Code Playgroud)

您需要在对象内传递选项,因此您的代码将是:

Model.update = function ({}, {cid: ''}, {multi: true}, function(err) { ... });
Run Code Online (Sandbox Code Playgroud)

新解决方案

Model.updateMany = function (query, doc, callback) { ... }

Model.updateMany = function ({}, {cid: ''}, function(err) { ... });
Run Code Online (Sandbox Code Playgroud)

我相信Mongoose将你的cid包装在$ set中,所以这与在mongo shell中运行相同的更新不同.如果你在shell中运行它,那么所有文档将被替换为一个文档cid: ''.


Rif*_*een 17

您必须使用multi:true选项

Device.update({},{cid: ''},{multi: true});
Run Code Online (Sandbox Code Playgroud)


Ser*_*nci 14

这些答案已被弃用.这是实际的解决方案:

Device.updateMany({}, { cid: '' });
Run Code Online (Sandbox Code Playgroud)