web-dev-qa-db-ja.com

mongooseで複数のドキュメントを更新するにはどうすればよいですか

次のスクリプトを見つけました。

Device.find(function(err, devices) {
  devices.forEach(function(device) {
    device.cid = '';
    device.save();
  });
});

MongoDBには、複数のドキュメントを更新するための「マルチ」フラグがありますが、これをmongooseで動作させることはできませんでした。これはまだサポートされていませんか、何か間違っていますか?!

Device.update({}, {cid: ''}, false, true, function (err) {
  //...
});
49
pkyeck

現在、Mongooseのupdate()にはいくつかの問題があると考えています。 https://groups.google.com/forum/#%21topic/mongoose-orm/G8i9S7E8Erg および- https://groups.google.com/d/topic/mongoose-orm/K5pSHT4hJ_A/discussion

ただし、ドキュメントの更新を確認してください: http://mongoosejs.com/docs/api.html (そのモデルの下)。定義は次のとおりです。

以前のソリューション(mongoose 5+バージョンの後に減価償却)

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

オブジェクト内でオプションを渡す必要があるため、コードは次のようになります。

Model.update = function ({}, {cid: ''}, {multi: true}, function(err) { ... });

新しいソリューション

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

Model.updateMany = function ({}, {cid: ''}, function(err) { ... });

Mongooseはあなたのcidを$ setでラップするので、mongo Shellで同じアップデートを実行するのと同じではないと思います。シェルで実行した場合、すべてのドキュメントは単一のcid: ''

76
kcbanner

Multi:trueオプションを使用する必要があります

Device.update({},{cid: ''},{multi: true});
17
Rifaideen

これらの回答は非推奨です。これが実際の解決策です。

Device.updateMany({}, { cid: '' });
12