Мангуст: 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);
});

У меня уже есть запись в моей базе данных mongo, и я хотел бы запустить этот код, чтобы обновить имя, для которого возраст 17, а затем распечатать результат в конце кода.

однако, почему я все еще получаю тот же результат от консоли(не изменяю имя), но когда я иду в командную строку mongo db и набираю "db.кошки.находить.";)( Результат был изменен.

затем я возвращаюсь, чтобы снова запустить этот код и результат модифицированный.

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

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, верните измененный документ а не оригинал. по умолчанию 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);
});

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


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

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

});

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

MongoDB shell

{returnNewDocument: true}

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

Мангуста

{new: true}

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

узел.водитель на JS MongoDB в API:

{returnOriginal: false}

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


для тех, кто наткнулся на это, используя стиль 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 */ }

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

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

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

принято официальным 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, и то, что я предпочитаю использовать, - это 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);
    });