복붙노트

[MONGODB] 몽구스 : findOneAndUpdate 업데이트 문서를 반환하지 않습니다

MONGODB

몽구스 : findOneAndUpdate 업데이트 문서를 반환하지 않습니다

다음은 내 코드입니다

var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/test');

var Cat = mongoose.model('Cat', {
    name: String,
    age: {type: Number, default: 20},
    create: {type: Date, default: Date.now} 
});

Cat.findOneAndUpdate({age: 17}, {$set:{name:"Naomi"}},function(err, doc){
    if(err){
        console.log("Something wrong when updating data!");
    }

    console.log(doc);
});

난 이미 내 몽고 데이터베이스에 몇 가지 기록을 가지고 있고 나이는 17이고, 다음 코드의 끝 부분에서 결과를 인쇄하는 업데이트 이름이 코드를 실행하고 싶습니다.

그러나 난 아직도 왜 콘솔에서 같은 결과 (안 수정 된 이름)을 얻을하지만 난 DB 명령 줄을 입력 몽고에 갈 때 "db.cats.find를 ();". 그 결과, 이름을 변경해왔다.

그런 다음 다시이 코드를 실행하는 돌아가서 결과가 수정됩니다.

내 질문은 : 데이터가 수정 된 경우를 CONSOLE.LOG 때, 나는 여전히 처음에 원본 데이터를 가지고 왜.

해결법

  1. ==============================

    1.기본값은 변경되지 않은 원본 문서를 반환하는 것입니다. true로 새 속성 세트 객체 : 새 업데이트 된 문서를 반환 할 경우에는 추가 인수를 전달해야합니다.

    기본값은 변경되지 않은 원본 문서를 반환하는 것입니다. true로 새 속성 세트 객체 : 새 업데이트 된 문서를 반환 할 경우에는 추가 인수를 전달해야합니다.

    몽구스 문서에서 :

    그래서, 당신은 문서 변수에 업데이트 된 결과를 원하는 경우 :

    Cat.findOneAndUpdate({age: 17}, {$set:{name:"Naomi"}}, {new: true}, (err, doc) => {
        if (err) {
            console.log("Something wrong when updating data!");
        }
    
        console.log(doc);
    });
    
  2. ==============================

    2.대신 {새로운 : TRUE}의 : 대신 몽구스의 Node.js를 드라이버를 사용하는 모든 사용자를 들어, 사용 {거짓 returnOriginal}에 할 것입니다.

    대신 {새로운 : TRUE}의 : 대신 몽구스의 Node.js를 드라이버를 사용하는 모든 사용자를 들어, 사용 {거짓 returnOriginal}에 할 것입니다.

  3. ==============================

    3.그래서, "findOneAndUpdate는"원본 문서를 반환 할 수있는 옵션이 필요합니다. 그리고, 옵션은 다음과 같습니다

    그래서, "findOneAndUpdate는"원본 문서를 반환 할 수있는 옵션이 필요합니다. 그리고, 옵션은 다음과 같습니다

    {returnNewDocument : TRUE}

    참조 : https://docs.mongodb.com/manual/reference/method/db.collection.findOneAndUpdate/

    {새로운 : TRUE}

    참조 : http://mongoosejs.com/docs/api.html#query_Query-findOneAndUpdate

    {returnOriginal : 거짓}

    참조 : http://mongodb.github.io/node-mongodb-native/3.0/api/Collection.html#findOneAndUpdate

  4. ==============================

    4.기본적으로 findOneAndUpdate은 원본 문서를 반환합니다. 함수에 : 당신이 그것을 반환 할 경우 수정 된 문서는 {사실 새로운} : 옵션 개체를 전달 :

    기본적으로 findOneAndUpdate은 원본 문서를 반환합니다. 함수에 : 당신이 그것을 반환 할 경우 수정 된 문서는 {사실 새로운} : 옵션 개체를 전달 :

    Cat.findOneAndUpdate({ age: 17 }, { $set: { name: "Naomi" } }, { new: true }, function(err, doc) {
    
    });
    
  5. ==============================

    5.기본 약속이 사용 ES6 / ES7 스타일을 우연히 발견 누구든지, 여기 당신이 채택 할 수있는 패턴입니다 ...

    기본 약속이 사용 ES6 / ES7 스타일을 우연히 발견 누구든지, 여기 당신이 채택 할 수있는 패턴입니다 ...

    const user = { id: 1, name: "Fart Face 3rd"};
    const userUpdate = { name: "Pizza Face" };
    
    try {
        user = await new Promise( ( resolve, reject ) => {
            User.update( { _id: user.id }, userUpdate, { upsert: true, new: true }, ( error, obj ) => {
                if( error ) {
                    console.error( JSON.stringify( error ) );
                    return reject( error );
                }
    
                resolve( obj );
            });
        })
    } catch( error ) { /* set the world on fire */ }
    
  6. ==============================

    6.이 findOneAndUpdate에 대한 업데이트 된 코드입니다. 그것은 작동합니다.

    이 findOneAndUpdate에 대한 업데이트 된 코드입니다. 그것은 작동합니다.

    db.collection.findOneAndUpdate(    
      { age: 17 },      
      { $set: { name: "Naomi" } },      
      {
         returnNewDocument: true
      }    
    )
    
  7. ==============================

    7.// 당신이 Cat.findOneAndUpdate (조건, 갱신, 옵션, 콜백)를 사용할 수 있습니다 API 참조가 실행을 : 당신이 변경된 문서를 반환 할 경우에 당신은 {사실 새로운} 옵션을 설정해야합니다

    // 당신이 Cat.findOneAndUpdate (조건, 갱신, 옵션, 콜백)를 사용할 수 있습니다 API 참조가 실행을 : 당신이 변경된 문서를 반환 할 경우에 당신은 {사실 새로운} 옵션을 설정해야합니다

    공식 몽구스 API에 의해 촬영하는 http://mongoosejs.com/docs/api.html#findoneandupdate_findOneAndUpdate 다음과 같은 매개 변수를 사용할 수 있습니다

    A.findOneAndUpdate(conditions, update, options, callback) // executes
    A.findOneAndUpdate(conditions, update, options)  // returns Query
    A.findOneAndUpdate(conditions, update, callback) // executes
    A.findOneAndUpdate(conditions, update)           // returns Query
    A.findOneAndUpdate()                             // returns Query
    

    또 다른 구현 그게 전부는 공식 API 페이지에 표시하고 당신이 모든 다양한 오류를 처리 할 수있는 .catch 가질 수 있도록 약속의 기본 구현이 무엇인지 내가 사용하는 것을 선호하지 않습니다.

        let cat: catInterface = {
            name: "Naomi"
        };
    
        Cat.findOneAndUpdate({age:17}, cat,{new: true}).then((data) =>{
            if(data === null){
                throw new Error('Cat Not Found');
            }
            res.json({ message: 'Cat updated!' })
            console.log("New cat data", data);
        }).catch( (error) => {
            /*
                Deal with all your errors here with your preferred error handle middleware / method
             */
            res.status(500).json({ message: 'Some Error!' })
            console.log(error);
        });
    
  8. ==============================

    8.여기 몽구스 메인테이너. true로 새로운 옵션을 설정해야합니다 (false로 동등하게, 또는, returnOriginal)

    여기 몽구스 메인테이너. true로 새로운 옵션을 설정해야합니다 (false로 동등하게, 또는, returnOriginal)

    await User.findOneAndUpdate(filter, update, { new: true });
    
    // Equivalent
    await User.findOneAndUpdate(filter, update, { returnOriginal: false });
    

    참조 몽구스 findOneAndUpdate () 문서와 몽구스의 문서 업데이트에 대한이 튜토리얼.

  9. ==============================

    9.쇼 아래 몽구스에 대한 쿼리는 findOneAndUpdate을합니다. 여기에 새로운 : 사실 업데이트 된 문서를 가져 오는 데 사용됩니다 및 필드 얻기 위해 특정 분야에 사용됩니다.

    쇼 아래 몽구스에 대한 쿼리는 findOneAndUpdate을합니다. 여기에 새로운 : 사실 업데이트 된 문서를 가져 오는 데 사용됩니다 및 필드 얻기 위해 특정 분야에 사용됩니다.

    예를 들면. findOneAndUpdate (조건, 갱신, 옵션, 콜백)

    await User.findOneAndUpdate({
          "_id": data.id,
        }, { $set: { name: "Amar", designation: "Software Developer" } }, {
          new: true,
          fields: {
            'name': 1,
            'designation': 1
          }
        }).exec();
    
  10. from https://stackoverflow.com/questions/32811510/mongoose-findoneandupdate-doesnt-return-updated-document by cc-by-sa and MIT license