programing

mongoose에서 여러 문서를 업데이트하려면 어떻게 해야 하나요?

showcode 2023. 4. 5. 22:30
반응형

mongoose에서 여러 문서를 업데이트하려면 어떻게 해야 하나요?

다음 스크립트를 찾았습니다.

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

MongoDB에는 여러 문서에 대한 업데이트를 위한 "multi" 플래그가 있지만 mongoose에서는 이 플래그를 사용할 수 없었습니다.아직 지원되지 않는 건가요?아니면 제가 잘못하고 있는 건가요?

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

현시점에서는 그렇다고 생각합니다.update()Mongoose 에서는 몇 가지 문제가 있습니다.https://groups.google.com/forum/ # % 21 topic / 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에서 동일한 업데이트를 실행하는 것과 같지 않습니다.셸에서 실행한 경우 모든 문서는 1개의 단일 문서로 대체됩니다.cid: ''.

그 답변들은 더 이상 사용되지 않습니다.실제 솔루션은 다음과 같습니다.

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

multi: true 옵션을 사용해야 합니다.

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

mongoose 문서에서 언급한 바와 같이 이 방법은 다음과 같습니다.

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('/');
          }
        }
      });

이 방법이 나에게 도움이 됐으면 좋겠다:)

await Device.updateMany({_id: {$in: cid}},{ $set: {columnNameHere: "columnValueHere"}},{multi:true,upsert: true,new: true});

@contains가 언급한 바와 같이:

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

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

콜백 기능을 추가할 수 있습니다.options그럴 필요는 없어요

다음과 같은 방법으로 시도할 수 있습니다.

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
    })
}

언급URL : https://stackoverflow.com/questions/6694507/how-can-i-update-multiple-documents-in-mongoose

반응형