programing

Mongodb에서의 문서 갱신 및 반환

megabox 2023. 3. 15. 19:30
반응형

Mongodb에서의 문서 갱신 및 반환

업데이트된 문서를 받고 싶습니다.이것은 원래 코드이며 정상적으로 업데이트되지만 문서가 반환되지 않습니다.

collection.update({ "code": req.body.code },{$set:  req.body.updatedFields}, function(err, results) {
                        res.send({error: err, affected: results});
                        db.close();
                    });

제가 사용한 것은toArray이 함수는 "Cannot use a write Concern without a provided callback" 이라는 오류를 발생시켰습니다.

collection.update({ "code": req.body.code },{$set:  req.body.updatedFields}).toArray( function(err, results) {
                    res.send({error: err, affected: results});
                    db.close();
                });

좋은 생각 있어요?

collection.update() 는 자신의 콜백에 영향을 받은 문서의 수만을 보고합니다.

수정 중에 문서를 가져오려면 대신 (이전)을 사용합니다.

collection.findOneAndUpdate(
    { "code": req.body.code },
    { $set: req.body.updatedFields },
    { returnOriginal: false },
    function (err, documents) {
        res.send({ error: err, affected: documents });
        db.close();
    }
);

returnOriginal옵션(또는newWith Mongoose)를 사용하면 콜백에 전달될 발견된 문서의 버전(원본 [기본값] 또는 업데이트된 버전)을 지정할 수 있습니다.

returnOriginal버전에서는 권장되지 않습니다.3.6.사용하다returnDocument: "before" | "after"버전용3.6그리고 나중에.


면책사항:이 답변은 현재 버전 3.6 이후의 Node.js 드라이버를 참조하고 있습니다.새 버전이 출시되면 해당 문서에서 새로운 권장 해제 경고 및 권장되는 대체 방법을 확인하십시오.

솔루션은 다음과 같이 설정합니다. {returnOriginal: false}.

collection.findOneAndUpdate(
        whereObj,
        updateObj,
        {returnOriginal: false});

docs에서 많은 갱신과 수정된 레코드를 반환하는 방법을 찾을 수 없었기 때문에 회피책을 강구했습니다.

적어도 다음 방법으로 찾을 수 있는 장애 중 하나는 문서가 수정되었는지 또는 이미 사용 중인 값이 있는지 알 수 없다는 것입니다.

function findAndUpdateMany(filter, updateOptions) {
  return collection.find(filter).project({_id: 1}).toArray()
    .then(function(matchingIds) {
      filter = {_id: {$in: matchingIds}}
      return collection.updateMany(filter, updateOptions)
    }).then(function() {
      return collection.find(filter).toArray()
    })
}

파티에는 조금 늦었지만, 여기 당신의 질문에 대한 간단한 2022년 해결책이 있습니다.이 앱은 NestJs를 사용하고 있습니다.

const updatedPainting: Partial<IGallery> = {
    imageAltTxt: updateGalleryDto.imageAltTxt,
    name: updateGalleryDto.name,
    dateCreated: updateGalleryDto.dateCreated,
    size: updateGalleryDto.size,
    description: updateGalleryDto.description,
    isFeatured: updateGalleryDto.isFeatured || false,
  };
  return await this.galleryModel.findOneAndUpdate(
    { _id },
    { $set: { imageUrl, ...updatedPainting } },
    { returnDocument: 'after' },
  );

하나의 문서에서 업데이트 작업을 수행할 때 업데이트된 문서를 가져오려면 findOneAndUpdate()를 사용하고 옵션 개체에서 returnDocument 속성을 'after'로 설정하십시오.

let options = {returnDocument: 'after'}

const upadatedDoc = collection.findOneAndUpdate({'your query'},{'your update'}, options)

몽구스를 쓰시는 분들은returnOriginal: false에서는 통하지 않았다.v5.11.10,

그렇지만new: true일했다,

공식 mongoose 문서에서:

const filter = { name: 'Jean-Luc Picard' };
const update = { age: 59 };

let doc = await Character.findOneAndUpdate(filter, update, {
  new: true
});
doc.name; // 'Jean-Luc Picard'
doc.age; // 59

WriteResult 개체를 확인합니다.

http://docs.mongodb.org/manual/reference/method/db.collection.update/ #writeresults-update

WriteResult result = collection.update({ "code": req.body.code },{$set:  req.body.updatedFields}, function(err, results) {
                    res.send({error: err, affected: results});
                    db.close();
                });

결과는 다음과 같습니다.

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

업데이트된 결과를 원할 경우 기본 키로 다른 쿼리를 수행합니다.

언급URL : https://stackoverflow.com/questions/24747189/update-and-return-document-in-mongodb

반응형