61

次のスクリプトが見つかりました。

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

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

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

6 に答える 6

90

現在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(モデルの下にあります)。定義は次のとおりです。

以前のソリューション(マングース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シェルで同じ更新を実行することと同じではありません。これをシェルで実行すると、すべてのドキュメントが1つのドキュメントに置き換えられcid: ''ます。

于 2011-07-14T16:26:24.267 に答える
29

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

Device.updateMany({}, { cid: '' });
于 2018-10-08T23:31:52.503 に答える
19

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

Device.update({},{cid: ''},{multi: true});
于 2017-04-24T10:59:44.213 に答える
1

マングースの文書で述べられているように、これは私たちがこれを行う方法です:

db.collection.updateMany(condition, update, options, callback function)

したがって、これはドキュメントに基づく例です。

    // creating arguments
    let conditions = {};
    let update = {
        $set : {
      title : req.body.title,
      description : req.body.description,
      markdown : req.body.markdown
      }
    };
    let options = { multi: true, upsert: true };

    // update_many :)
    YourCollection.updateMany(

      conditions, update, options,(err, doc) => {
        console.log(req.body);
        if(!err) {
          res.redirect('/articles');
        }
        else {
          if(err.name == "ValidationError"){
            handleValidationError(err , req.body);
            res.redirect('/new-post');
          }else {
            res.redirect('/');
          }
        }
      });

これは私にとってはうまくいきました、私はそれが役立つことを願っています:)

于 2020-04-09T16:37:39.147 に答える
0

@sinaが述べたように:

let conditions = {};
let options = { multi: true, upsert: true };

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

後にコールバック関数を追加できますが、options必須ではありません。

于 2020-05-18T10:59:07.957 に答える
0

次の方法を試すことができます

try {
    const icMessages = await IcMessages.updateMany({
        room: req.params.room
    }, {
        "$set": {
            seen_status_2: "0"
        }
    }, {
        "multi": true
    });
    res.json(icMessages)

} catch (err) {
    console.log(err.message)
    res.status(500).json({
        message: err.message
    })
}
于 2021-02-18T09:12:26.030 に答える