mongodb: findOneAndUpdate не работает [дубликат]

Соединение с MySql JDBC:

Class.forName("com.mysql.jdbc.Driver");     

Connection con=DriverManager.getConnection("jdbc:mysql://localhost:3306/DatabaseName","Username","Password");         
Statement stmt=con.createStatement();            
stmt = con.createStatement();
ResultSet rs=stmt.executeQuery("Select * from Table");  
144
задан Nishant Shreshth 27 September 2015 в 18:52
поделиться

7 ответов

По умолчанию используется возврат неизмененного документа. Если вы хотите, чтобы новый, обновленный документ возвращался, вам нужно передать дополнительный аргумент: объект с свойством new, установленным на true.

http://mongoosejs.com /docs/api.html#model_Model.findOneAndUpdate

Запрос # findOneAndUpdate

function(error, doc) {
  // error: any errors that occurred
  // doc: the document before updates are applied if `new: false`, or after updates if `new = true`
}

Доступные опции

new: bool - если true, вернуть измененный документ, а не оригинал. defaults to false (изменено в 4.0)

Итак, если вы хотите обновленный результат в переменной doc:

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

    console.log(doc);
});
296
ответ дан Cristy 28 August 2018 в 23:17
поделиться

Для тех, кто наткнулся на это, используя стиль 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 */ }
10
ответ дан flash 28 August 2018 в 23:17
поделиться

Если вы хотите вернуть измененный документ, вам нужно установить ссылку API {new:true} API, вы можете использовать Cat.findOneAndUpdate(conditions, update, options, callback) // executes

, принятый официальным API Mongoose 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, и это то, что я предпочитаю использовать, это Promise, которые позволяют вам иметь .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);
    });
0
ответ дан Jonathan Thurft 28 August 2018 в 23:17
поделиться

По умолчанию findOneAndUpdate возвращает исходный документ. Если вы хотите, чтобы он возвратил измененный документ, передайте объект опций { new: true } в функцию:

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

});
30
ответ дан Nishant Shreshth 28 August 2018 в 23:17
поделиться

Это обновленный код для findOneAndUpdate. Он работает.

db.collection.findOneAndUpdate(    
  { age: 17 },      
  { $set: { name: "Naomi" } },      
  {
     returnNewDocument: true
  }    
)
6
ответ дан Paul Roub 28 August 2018 в 23:17
поделиться

Для тех, кто использует драйвер Node.js вместо Mongoose, вы захотите использовать {returnOriginal:false} вместо {new:true}.

33
ответ дан Pedro Hoehl Carvalho 28 August 2018 в 23:17
поделиться

Итак, «findOneAndUpdate» требует опции для возврата исходного документа. И, опция:

MongoDB shell

{returnNewDocument: true}

Ссылка: https://docs.mongodb.com/manual/reference /method/db.collection.findOneAndUpdate/

Mongoose

{new: true}

Ссылка: http://mongoosejs.com /docs/api.html#query_Query-findOneAndUpdate

Node.js API-интерфейс драйвера MongoDB:

{returnOriginal: false}

Ссылка: http://mongodb.github.io/node-mongodb-native/3.0/api/Collection.html#findOneAndUpdate

14
ответ дан Tsuneo Yoshioka 28 August 2018 в 23:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: