programing

MongoDB의 .updateOne이 Node.js에서 작동하지 않습니다.

newsource 2023. 6. 24. 09:15

MongoDB의 .updateOne이 Node.js에서 작동하지 않습니다.

다음 코드가 있습니다.

connection((db) => {
            db.collection('orders')
                .updateOne(
                    { "_id": req.body._id}, // Filter
                    {"name": req.body.name} // Update
                )
                .then((obj) => {
                    console.log('Updated - ' + obj);
                    res.redirect('orders')
                })
                .catch((err) => {
                    console.log('Error: ' + err);
                })
        })

저는 순서대로 이름을 바꾸고 싶은데 업데이트가 안 됩니다.콘솔의 결과는 다음과 같습니다.

Updated - {"n":0,"nModified":0,"ok":1}

설명서를 읽으려고 했지만 끔찍합니다.

편집:{$set: {"name": req.body.name}},역시 효과가 없었습니다.

EDIT 2: 전달된 ID가 데이터베이스의 _id와 일치합니다.데이터베이스에서 "ObjectId('5a42ja...')"라고 하는데 일반 텍스트 ID를 쿼리하는 것이 문제가 될 수 있습니까?

업데이트 쿼리에서 다음과 같이 "$set"을 사용해야 할 수도 있습니다.

{$set: {"name": req.body.name}}, // Update

설명서의 추가 정보

편집

작동하지 않으면 필터와 일치하는 항목이 없기 때문일 수 있습니다.

다음과 같은 ObjectId와 일치하도록 시도해야 할 수 있습니다.

var ObjectID = require('mongodb').ObjectID;

// In your request
{ "_id": ObjectID(req.body._id)}, // Filter

도움이 되길 바랍니다.

사용하다{$set: {"name": req.body.name}}(Sparw에서 언급한 대로) 문서에서 원하는 속성을 업데이트합니다.또한 매개 변수로 전달하는 ID가 컬렉션에 없는 경우(같은 ID로 생성하려는 경우) 세 번째 매개 변수로 전달할 수 있습니다.{upsert: true}하나를 만드는 것.

예를 들어, 다음과 같습니다.

connection((db) => {
          db.collection('orders')
               .updateOne(
                  { "_id": req.body._id}, // Filter
                  {$set: {"name": req.body.name}}, // Update
                  {upsert: true} // add document with req.body._id if not exists 

             )
            .then((obj) => {
               console.log('Updated - ' + obj);
              res.redirect('orders')
         })
        .catch((err) => {
           console.log('Error: ' + err);
      }) })

올바른 구문은 다음과 같습니다.

monDb.collection.updateOne(
    {"_id": ObjectId(req.params.id)}, 
    { $set: updateDoc }, 
    function(err, doc) {
      ...
    }
);

업데이트: 아님ObjectID그렇지만ObjectId.

컬렉션 스키마에 업데이트할 필드가 없는 경우 이 문제가 발생할 수 있습니다.스키마가 엄격하지 않은 경우(예: Strict: false) 업데이트 연산자를 확인합니다.경우에 따라 새 업데이트 값이 기존 값과 같을 수 있습니다.이 경우 몽구스가 반환됩니다.

{ n: 1, nModified: 0, ok: 1 }

Tough @Spraw의 대답은 어떤 경우에는 옳지만, 때로는 효과가 없습니다.제 생각에 편리한 대답은updateOne({_id: new ObjectID(req.body._id)}, {$set: {"name": req.body.name}}, callback).

_idmongodb이다.BSON개체를 인스턴스화해야 합니다.

저는 업데이트에서 객체를 전달하기 전에 "_id"/id 필드를 삭제해야 합니다.

또는 필드가 유효하지 않다고 표시됩니다.

참조로 사용하는 동안 키를 업데이트하는 것은 분명 최선의 방법이 아닙니다.

저도 이런 문제가 있었습니다. 저는 _id from req.body로 상수를 만듭니다.

const {_id} = req.body  //pass ID user
await User.updateOne({_id},{$set:data}, (err)=>{
            if(err) return res.status(200).json({
                error: true,
                code: 115,
                message: "Erro to update user!"
            })
        })

NEXT.js

제 프로젝트는 React와 Next.js에 있습니다.저는 이 문제가 있었습니다.제 어리석은 해결책은 (다음 개발) xD로 재시작하는 것이었습니다.

Schema 모델에 두 개의 필드를 추가하고 그 새 필드를 업데이트하려고 했지만 mi project를 다시 시작할 때까지 작동하지 않았습니다.

누군가를 위해 시간을 절약하고 싶습니다.:)

몇 시간을 소비한 후 업데이트를 위해 ID 값을 정수로 변환해야 한다는 것을 알게 되었습니다. 그러나 찾기만 사용되는 경우에는 이것이 필요하지 않았습니다.

dbCollection.updateOne({ _id: parseInt(reqBody.id) }

언급URL : https://stackoverflow.com/questions/47656515/updateone-on-mongodb-not-working-in-node-js