下面是我的代码

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.cats.find();”。结果是修改后的名称。

然后我返回去再次运行这段代码,结果被修改了。

我的问题是:如果数据被修改了,那么为什么我仍然在console.log它的第一时间得到原始数据。


当前回答

export function newDocumentOnUpdatePlugin(schema) {
  schema.pre(
    ['update', 'findOneAndUpdate', 'updateOne', 'updateMany'],
    function (next) {
      this.setOptions({ new: true });
      next();
    },
  );
}

我已经创建了这个插件,如果有人需要整个应用程序的这个功能,想要避免重复。只要把它作为一个全局插件使用

其他回答

在某些情况下,{new: true}不起作用。 那你可以试试这个。

{'returnNewDocument':true}

因此,“findOneAndUpdate”需要一个选项来返回原始文档。选项是:

MongoDB shell

{returnNewDocument:真}

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

猫鼬

{新:真}

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

MongoDB Driver API:

{returnOriginal:假}

2021年- Mongodb ^4.2.0更新 {returnDocument: 'after'}

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

2021年- Mongodb ^4.2.0更新

适用于mongodb节点驱动,不适用于mongoose节点驱动。

如果你使用"collection.findOneAndUpdate"进行搜索和更新,最新版本的Mongodb节点驱动程序似乎使用了以下语法:

.findOneAndUpdate(query, update, { returnDocument: 'after' | 'before' })

我自己在搜索的时候找不到答案,所以把这个贴出来以防别人也有同样的情况。

此选项对于获取更新的文档实例是必需的

{ new: true }

确保你检查你使用的是Mongoose还是MongoDB

如果使用Mongoose -使用{new: true}

const query = await Model.findOneAndUpdate({filter}, {update}, {new: true});

如果使用MongoDB -使用{returnNewDocument: true}

const query = await Model.findOneAndUpdate({filter}, {update}, {returnNewDocument: true});

确保你用的是正确的,因为如果你不这样做,它就会被省略,你就会得到旧文档。